Python:改变列表的元素

Dan*_*ick 15 python coding-style

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

for b in bool_list:
    b = False
Run Code Online (Sandbox Code Playgroud)

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

for i in xrange(len(bool_list)):
    bool_list[i] = False
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ill 13

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

bool_list = [False] * len(bool_list)
Run Code Online (Sandbox Code Playgroud)

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

有关类似示例,请参阅我对Python字典清晰的答案.

  • 投票,因为他表示他需要它在现有名单中行动. (3认同)

Fed*_*oni 13

这是另一个版本:

bool_list = [False for item in bool_list]
Run Code Online (Sandbox Code Playgroud)


Dan*_*ick 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'
Run Code Online (Sandbox Code Playgroud)

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

基于切片的替换与列表理解:

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

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

基于切片的替换与生成器理解:

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

1000循环,最佳3:265每循环usec

枚举:

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

1000循环,每循环最佳3:385 usec

Numpy:

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

10000循环,最佳3:15.9 usec每循环

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

python timeit.py -s 'bool_list = [True] * 1000' 'bool_list[:] = [False] * len(bool_list)'
Run Code Online (Sandbox Code Playgroud)

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

使用列表乘法引用替换

 python timeit.py -s 'bool_list = [True] * 1000' 'bool_list = [False] * len(bool_list)'
Run Code Online (Sandbox Code Playgroud)

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


nam*_*min 11

bool_list[:] = [False] * len(bool_list)
Run Code Online (Sandbox Code Playgroud)

要么

bool_list[:] = [False for item in bool_list]
Run Code Online (Sandbox Code Playgroud)