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]]
我正在尝试构建列表的排列,每次都翻转第 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]]