当我尝试在嵌套列表中查找公用列表时,其值正在更改?

时间:2019-05-17 08:15:36

标签: python

好吧,我需要找到两个嵌套列表之间的公共列表,并创建一个包含这些公共列表的新列表,并用字母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']]

3 个答案:

答案 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_AA的浅表副本。这意味着它们都引用相同的基础对象。在for-each循环中,您正在遍历A的元素,并在进行操作时对其进行修改。这就是Anew_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)}