Python列表作为输入列表

时间:2015-01-24 15:55:47

标签: 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(3))))

这就是它的回报:

[[0, 1, 1], [0, 1, 1], [0, 1, 1]]

期待:

[[0, 0, 0], [1, 1, 0], [1, 0, 1]]

我做错了什么? (如果有人可以建议一个更短的代码,可能不使用一个flipbit方法,我会很感激,因为我不会真正使用除了这个目的之外的flipbit,我想保持代码简洁明了)

2 个答案:

答案 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]]