好吧,我需要找到两个嵌套列表之间的公共列表,并创建一个包含这些公共列表的新列表,并用字母B
标记它们,问题是更改中两个嵌套列表之一!
我试图将其存储在另一个列表new_A
中,即使其中一个正在更改中!
A = [[1,4],[2,5],[3,6],[0,1]]
B = [[1,4],[3,6],[7,8],[0,1]]
new_A=A
C=[]
for i in A:
if(np.isin(i,B).all()):
new_i=i
i.append('B')
C.append(new_i)
print(C)
print(new_A)
print(A)
输出为:
[[1,4,'B'],[3,6,'B'],[0,1,'B']]
[[1,4,'B'],[2,5],[3,6,'B'],[0,1,'B']]
[[1,4,'B'],[2,5],[3,6,'B'],[0,1,'B']]
答案 0 :(得分:1)
您不需要numpy或任何临时变量,例如new_i或new_A:
像这样的简单代码将起作用:
A = [[1,4],[2,5],[3,6],[0,1]]
B = [[1,4],[3,6],[7,8],[0,1]]
C = list() # same as C = []
for i in A: # loop in A
if i in B: # check if B includes i
C.append([*i, 'B']) # append i with 'B' to list B
如果您正在寻找“聪明”的一行代码,则可以执行以下操作:
C = [[*i, 'B'] for i in A if i in B]
或者您可以使用集合和交集:
A = [[1,4],[2,5],[3,6],[0,1]]
B = [[1,4],[3,6],[7,8],[0,1]]
# the inner list needs to be converted to tuple because list is not hashable
# we can create set of hashable elements only
set_A = set(tuple(i) for i in A)
set_B = set(tuple(i) for i in B)
# & is the intersection operator
C = list(set_A & set_B) # [(0, 1), (1, 4), (3, 6)]
C = [[*i, 'B'] for i in C] # [[0, 1, 'B'], [1, 4, 'B'], [3, 6, 'B']]
*
和**
是python中的解压缩运算符。有关更多详细信息,请参见https://www.python.org/dev/peps/pep-0448/。
答案 1 :(得分:0)
您要在同一列表中追加原因,请检查以下代码,使用i[::]
for i in A:
if(np.isin(i,B).all()):
new_i=i[::]
new_i.append('B')
C.append(new_i)
答案 2 :(得分:0)
new_A
是A
的浅表副本。这意味着它们都引用相同的基础对象。在for-each
循环中,您正在遍历A
的元素,并在进行操作时对其进行修改。这就是A
和new_A
似乎都发生变化的原因。
我将建议一种不同的方法。这将取决于列表中项目的顺序,但是如果不重要,则可以对其进行排序。试试这个:
A = set(tuple(i) for i in A)
B = set(tuple(i) for i in B)
C = A.intersection(B) # {(0, 1), (1, 4), (3, 6)}