Python 3.x 以列表作为输入的Python映射

Python 3.x 以列表作为输入的Python映射,python-3.x,Python 3.x,我试图构造一个列表的排列,每次都翻转第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

我试图构造一个列表的排列,每次都翻转第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,我想保持代码简洁明了)

你发布的代码根本无效,但我想你需要这个:

>>> 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
,然后获取
范围(3)
中的每个元素,并将其应用于
p

问题在于
[[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]]