改变列表的元素

时间:2009-01-03 20:07:29

标签: python coding-style

我有一个布尔列表,偶尔我将它们全部重置为假。首先将重置写为:

for b in bool_list:
    b = False

我发现它不起作用。我花了一些时间挠挠脑袋,然后想起那当然不会起作用,因为我只是改变了对bool的引用,而不是它的价值。所以我改写为:

for i in xrange(len(bool_list)):
    bool_list[i] = False

一切正常。但我发现自己在问:“这真的是改变列表中所有元素的最pythonic方法吗?”还有其他方法可以提高效率或更清晰吗?

8 个答案:

答案 0 :(得分:13)

如果您只对列表有一个引用,则以下内容可能更容易:

bool_list = [False] * len(bool_list)

这将创建一个填充了False元素的新列表。

有关类似示例,请参阅我对Python dictionary clear的回答。

答案 1 :(得分:13)

这是另一个版本:

bool_list = [False for item in bool_list]

答案 2 :(得分:12)

<强>摘要 性能方面,numpy或列表乘法是明显的赢家,因为它们比其他方法快10-20倍。

我对提出的各种选项进行了一些性能测试。我在Linux(Ubuntu 8.10)上使用Python 2.5.2,使用1.5 Ghz Pentium M.

<强>原始

python timeit.py -s 'bool_list = [True] * 1000' 'for x in xrange(len(bool_list)): bool_list[x] = False'

1000个循环,每个循环最好3:280 usec

使用列表解析进行基于切片的替换:

python timeit.py -s 'bool_list = [True] * 1000' 'bool_list[:] = [False for element in bool_list]'

1000个循环,最佳3:215每循环usec

使用生成器理解进行基于切片的替换:

python timeit.py -s 'bool_list = [True] * 1000' 'bool_list[:] = (False for element in bool_list)'

1000次循环,每循环最好3:265次使用

<强>枚举

python timeit.py -s 'bool_list = [True] * 1000' 'for i, v in enumerate(bool_list): bool_list[i] = False'

1000个循环,最好是每个循环3:385 usec

<强> numpy的

python timeit.py -s 'import numpy' -s 'bool_list = numpy.zeros((1000,), dtype=numpy.bool)' 'bool_list[:] = False'

10000次循环,最佳3:每循环使用15次

使用列表乘法进行基于切片的替换:

python timeit.py -s 'bool_list = [True] * 1000' 'bool_list[:] = [False] * len(bool_list)'

10000次循环,最佳3:每循环使用23.3次

使用列表乘法替换参考

 python timeit.py -s 'bool_list = [True] * 1000' 'bool_list = [False] * len(bool_list)'

10000次循环,最佳3:11.3每循环usec

答案 3 :(得分:11)

bool_list[:] = [False] * len(bool_list)

bool_list[:] = [False for item in bool_list]

答案 4 :(得分:4)

如果你愿意使用numpy数组,那么使用数组切片实际上很容易做到这一点。

import numpy

bool_list = numpy.zeros((100,), dtype=numpy.bool)

# do something interesting with bool_list as if it were a normal list

bool_list[:] = False
# all elements have been reset to False now

答案 5 :(得分:3)

我不会使用范围和len。使用enumerate()

更加清晰
for i, v in enumerate(bool_list): #i, v = index and value
    bool_list[i] = False

在这种情况下,它留下了一个未使用的变量,但在我看来它仍然看起来更干净。表现也没有明显变化。

答案 6 :(得分:0)

对于诸如int,bool和string之类的值类型,你的第二个例子就像它要获得的那样漂亮。您的第一个示例将适用于任何引用类型,如类,dicts或其他列表。

答案 7 :(得分:0)

我认为

bool_list = [False for element in bool_list]

与pythonic一样。使用这样的列表通常比python中的for循环更快。