Python 而我';我试图在嵌套列表中查找公共列表,其值正在更改?
嗯,我需要在两个嵌套列表之间找到公共列表,并创建一个包含这些公共列表的新列表,并用字母Python 而我';我试图在嵌套列表中查找公共列表,其值正在更改?,python,Python,嗯,我需要在两个嵌套列表之间找到公共列表,并创建一个包含这些公共列表的新列表,并用字母B标记它们,问题是更改中的两个嵌套列表之一 我尝试将它存储在另一个列表中,即使这个列表正在更改 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.appe
B
标记它们,问题是更改中的两个嵌套列表之一
我尝试将它存储在另一个列表中,即使这个列表正在更改
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']]
您在相同的列表中添加了原因,请检查下面的代码,使用
i[::]
for i in A:
if(np.isin(i,B).all()):
new_i=i[::]
new_i.append('B')
C.append(new_i)
您不需要numpy或任何临时变量,如new_i或new_A: 这样一个简单的代码可以工作: 如果您正在寻找一个“聪明”的单行代码,您可以这样做: 或者,您可以使用集合和交点:
*
和***
是python中的解包运算符。有关更多详细信息,请参阅。新的\u A
是A
的浅拷贝。这意味着它们都引用相同的基础对象。在for each
循环中,您正在迭代A
的元素,并在执行过程中对其进行修改。这就是为什么A
和new\u 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)}
new\u A
包含对A
的引用。我建议您阅读(由Ned Batchelder编写)以了解基本概念。请尝试new\u A=[*A]
,也许您也需要new\u I=[*I]
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']]
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)}