我有一个布尔值列表,偶尔我会将它们全部重置为false。在第一次将重置写为:
for b in bool_list:
b = False
我发现它不起作用。我花了一点时间挠头,然后想起它当然不会起作用,因为我只是改变了对bool的引用,而不是它的值。所以我重写为:
for i in xrange(len(bool_list)):
bool_list[i] = False
一切都很好。但是我发现自己在问:“这真的是改变列表中所有元素的最复杂的方法吗?”还有其他更有效或更清晰的方法吗?
8条答案
按热度按时间czq61nw11#
如果只有一个对列表的引用,则执行以下操作可能会更容易:
这将创建一个用
False
元素填充的新列表。类似的例子请参见我对Python字典clear的回答。
44u64gxh2#
下面是另一个版本:
jobtbby33#
总结从性能Angular 来看,numpy或列表乘法是明显的赢家,因为它们比其他方法快10- 20倍。
我对所提出的各种选项做了一些性能测试,我使用了Python 2.5.2,在Linux(Ubuntu 8.10)上,使用了1.5Ghz的Pentium M。
原件:
1000圈,三局两胜:每个回路280 usec
使用列表解析进行基于切片的替换:
1000圈,三局两胜:每个回路215 usec
使用生成器解析进行基于切片的替换:
1000圈,三局两胜:每个回路265 usec
枚举:
1000圈,三局两胜:每个循环385 usec
“小奶包”:
10000个循环,三局两胜:每个回路15.9 usec
使用列表乘法进行基于切片的替换:
10000个循环,三局两胜:每个回路23.3 usec
使用列表乘法替换引用
10000个循环,三局两胜:11.3微秒/回路
5jvtdoz24#
或
aij0ehis5#
如果你愿意使用numpy数组,使用数组切片做这样的事情实际上很容易。
axzmvihb6#
我不会使用range和len,使用enumerate()会干净得多
在本例中,它只剩下一个未使用的变量,但在我看来,它看起来仍然很干净,性能也没有明显的变化。
avkwfej47#
对于int、bool和string这样的值类型,第二个例子就像它将要得到的一样漂亮。第一个例子将适用于任何引用类型,如类、字典或其他列表。
iyr7buue8#
我觉得
使用这样的列表通常应该比Python中的for循环更快。