Python 以列表作为输入的地图

Python map with list as input

我正在尝试构建列表的排列,每次都翻转第 i 位。

例如:

有输入:

[1,0,0,0]

获得:

[0,0,0,0]

[1,1,0,0]

[1,0,1,0]

[1,0,0,1]

我写了一个方法给了一个列表 returns 相同的列表,位置 p 的位改变了:

def flipBit(l,p):
    l[p] = ~l[p]&1
    return l

我正在尝试使用 map() 来应用它,但我什至无法使用一个基本示例:

p=list(map(flipBit, [[1,0,0]]*3,range(3))))

就是这样 returns:

[[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,然后获取 range(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]]