我有一个布尔列表,偶尔我将它们全部重置为假.首次将重置写为:
for b in bool_list: b = False
我发现它不起作用.我花了一些时间挠挠脑袋,然后想起那当然不会起作用,因为我只是改变了对bool的引用,而不是它的价值.所以我重写为:
for i in xrange(len(bool_list)): bool_list[i] = False
一切正常.但我发现自己在问:"这真的是改变列表中所有元素的最pythonic方法吗?" 还有其他方法可以提高效率或更清晰吗?
如果您只有一个对列表的引用,则以下内容可能更容易:
bool_list = [False] * len(bool_list)
这将创建一个填充了False
元素的新列表.
有关类似示例,请参阅我对Python字典清晰的答案.
这是另一个版本:
bool_list = [False for item in bool_list]
总结 性能方面,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每循环usec
枚举:
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.9 usec每循环
使用列表乘法进行基于切片的替换:
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
bool_list[:] = [False] * len(bool_list)
要么
bool_list[:] = [False for item in bool_list]