我正在尝试构建列表的排列,每次都会翻转第i位。
例如:
输入:
[1,0,0,0]
获得:
[0,0,0,0]
[1,1,0,0]
[1,0,1,0]
[1,0,0,1]
我写了一个方法,给定一个列表返回相同的列表,位置p的位改变了:
def flipBit(l,p):
l[p] = ~l[p]&1
return l
我正在尝试使用map()
来应用它,但我甚至无法得到一个基本的示例:
p=list(map(flipBit, [[1,0,0]]*3,range(3))))
这就是它的回报:
[[0, 1, 1], [0, 1, 1], [0, 1, 1]]
期待:
[[0, 0, 0], [1, 1, 0], [1, 0, 1]]
我做错了什么? (如果有人可以建议一个更短的代码,可能不使用一个flipbit方法,我会很感激,因为我不会真正使用除了这个目的之外的flipbit,我想保持代码简洁明了)
答案 0 :(得分:1)
你发布的的代码根本没有效果,但我认为你需要这个:
>>> p=list(map(lambda x: flipBit([1, 0, 0], x), range(3)))
>>> p
[[0, 0, 0], [1, 1, 0], [1, 0, 1]]
基本上,您使用lambda
函数进行映射,该函数将[1, 0, 0]
部分应用为l
,然后将range(3)
中的每个元素应用于p
}。
答案 1 :(得分:1)
问题是[[1,0,0]]*3
创建了一个包含三个引用到同一个子列表的列表。当您更改一个子列表时,它们都会发生变化。
以下是解决此问题的一种方法:
>>> list(map(flipBit, [[1,0,0] for _ in range(3)], range(3)))
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
[[0, 0, 0], [1, 1, 0], [1, 0, 1]]
这是一种在不使用辅助函数的情况下实现此功能的方法:
>>> l = [1, 0, 0]
>>> [l[:i] + [1-l[i]] + l[i+1:] for i in range(len(l))]
[[0, 0, 0], [1, 1, 0], [1, 0, 1]]