我的代码的目的是创建一个列表列表,其中包含二进制列表中两个开关的所有组合。
例如[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如何处理二维列表更改有关,但我无法弄明白。
答案 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