更改二维列表中的一个元素会更改列表中列表的所有重复项

时间:2018-04-15 05:25:28

标签: python

我的代码的目的是创建一个列表列表,其中包含二进制列表中两个开关的所有组合。

例如[1,0,0,1,0]的两个切换为[0,0,0,1,1]

我编写的代码是第一个开关。我正在尝试编写代码,该代码接收第一个开关的输入并进行第二次切换。输入的顺序基于第一个开关的位置。所以,第一个元素列表在第一个元素中有第一个开关,第二个元素列表在第二个元素中有它的开关......我不会切换这些元素,因为它会撤消第一个开关。

以下是我所拥有的。 nbrhood列表是已经有一个切换的列表的假设列表

import itertools

n = 4
nbrhood = [[1,1,1,1],[0,0,0,0]]
nbrhood2 = list(itertools.chain.from_iterable(itertools.repeat(x, (n-1)) for x in nbrhood))
print(nbrhood2)


h = 0
f = 0   
for j in range(0,6):

    f = j//(n-1)

    if n <= h:
        h = 0

    if h != f and h <= n:
        if nbrhood2[j][h] == 1:
            nbrhood2[j][h] = 0
        else:
            nbrhood2[j][h] = 1
        h = h + 1
    elif h == f and h <= n:
        if nbrhood2[j][h+1] == 1:
            nbrhood2[j][h+1] = 0 
        else:
            nbrhood2[j][h+1] = 1  
        h = h + 2
    elif h >= n:
        h = 0

    print(nbrhood2[j])

这是意外的输出:

[1, 0, 1, 1]
[1, 0, 0, 1]
[1, 0, 0, 0]
[1, 0, 0, 0]
[1, 0, 1, 0]
[1, 0, 1, 1]

我需要输出看起来像这样:

[1, 0, 1, 1]
[1, 1, 0, 1]
[1, 1, 1, 0]
[1, 0, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]

我不明白我对nbrhood2中的一个列表所做的更改也适用于其他列表。就像放在第一个列表中的第二个位置的0也进入第二个列表中的第二个位置一样。

我一直在努力工作几个小时而没有真正的解释。我想这与Python如何处理二维列表更改有关,但我无法弄明白。

3 个答案:

答案 0 :(得分:1)

Python中的列表始终是引用的。当你执行nbrhood时,你真的会重复itertools.repeat(x, (n-1)) for x in nbrhood中的嵌套值。

只需将第一个x替换为x[:]

,即可复制完整列表
itertools.repeat(x[:], (n-1)) for x in nbrhood

答案 1 :(得分:0)

创建包含所有组合的列表非常简单

 l  = list(itertools.product([0,1], repeat=4))
[[i] for i in l]

输出

[[(0, 0, 0, 0)], [(0, 0, 0, 1)], [(0, 0, 1, 0)], [(0, 0, 1, 1)], [(0, 1, 0, 0)], [(0, 1, 0, 1)], [(0, 1, 1, 0)], [(0, 1, 1, 1)], [(1, 0, 0, 0)], [(1, 0, 0, 1)], [(1, 0, 1, 0)], [(1, 0, 1, 1)], [(1, 1, 0, 0)], [(1, 1, 0, 1)], [(1, 1, 1, 0)], [(1, 1, 1, 1)]]

答案 2 :(得分:0)

您可以迭代第一个开关的所有项目,并在嵌套循环中迭代第二个开关的所有后续项目。在外循环索引之后从内部循环开始,确保您不会重复覆盖。

def two_switch(original):
    list_of_2_switches = []
    for i in range(len(original)):
        one_switch = original[:] #copy to retain original
        one_switch[i]=1-one_switch[i]
        for j in range(i+1, range(len(original))):
            second_switch=one_switch[:]
                second_switch[j] = 1-second_switch[j]
            lit_of_2_switches.append(second_switch)
    return list_of_2_switches