Как сделать новый список номеров, не добавленных в его собственный список? - PullRequest
0 голосов
/ 10 февраля 2019

Если у меня есть многомерный список с именем t и я добавляю некоторые числа из списка в новый список с именем TC, как мне взять все числа, которые не были добавлены в новый список, и поместить их в свой собственный список,называется nonTC?Например:

t = [[1, 3, 4, 5, 6, 7],[9, 7, 4, 5, 2], [3, 4, 5]]

И я пишу некоторые условия, чтобы добавить только некоторые значения из каждого списка, чтобы создать новый список, TC:

TC = [[3, 4, 6], [9, 7, 2], [5]]

Как добавить значения, не включенныев ТС в свой список?Поэтому я бы получил:

nonTC = [[1, 5, 7],[4, 5],[3,4]]

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Просто из любопытства, используя NumPy:

import numpy as np

t = [[1, 3, 4, 5, 6, 7],[9, 7, 4, 5, 2], [3, 4, 5]]
TC = [[3, 4, 6], [9, 7, 2], [5]]

print([np.setdiff1d(a, b) for a, b in zip(t, TC)])
#=> [array([1, 5, 7]), array([4, 5]), array([3, 4])]
0 голосов
/ 10 февраля 2019

Вы можете использовать списки и списки наборов для фильтрации вашего исходного списка:

t = [[1, 3, 4, 5, 6, 7],[9, 7, 4, 5, 2], [3, 4, 5]]

# filter sets - each index corresponds to one inner list of t - the numbers in the 
# set should be put into TC - those that are not go into nonTC
getem = [{3,4,6},{9,7,2},{5}]

TC = [ [p for p in part if p in getem[i]] for i,part in enumerate(t)]
print(TC)

nonTC = [ [p for p in part if p not in getem[i]] for i,part in enumerate(t)]     
print(nonTC)

Вывод:

[[3, 4, 6], [9, 7, 2], [5]] # TC
[[1, 5, 7], [4, 5], [3, 4]] # nonTC

Readup:

И: Объяснение того, как работает понимание вложенного списка?


Предложение другого способа сделать это, кредиты AChampion :

TC_1 = [[p for p in part if p in g] for g, part in zip(getem, t)]
nonTC_1 = [[p for p in part if p not in g] for g, part in zip(getem, t)]

См. zip () - по сути, он объединяет два списка в итерируемый набор кортежей

( (t[0],getem[0]), (t[1],getem[1]) (t[2],getem[2])) 

Надстройка для множественных вхождений - исключение списка и наборов:

t = [[1, 3, 4, 5, 6, 7, 3, 3, 3],[9, 7, 4, 5, 2], [3, 4, 5]]

# filter lists - each index corresponds to one inner list of t - the numbers in the list
# should be put into TC - those that are not go into nonTC - exactly with the amounts given
getem = [[3,3,4,6],[9,7,2],[5]]

from collections import Counter
TC = []
nonTC = []
for f, part in zip(getem,t):
    TC.append([])
    nonTC.append([])
    c = Counter(f) 
    for num in part:
        if c.get(num,0) > 0:
            TC[-1].append(num)
            c[num]-=1
        else:
            nonTC[-1].append(num)            

print(TC)    # [[3, 4, 6, 3], [9, 7, 2], [5]]
print(nonTC) # [[1, 5, 7, 3, 3], [4, 5], [3, 4]]

Требуется только 1 проход по вашим предметам вместо 2 (отдельные списки), что делает его, вероятно, более эффективным в долгосрочной перспективе ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...