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)}