python 更改列表元素

ymzxtsji  于 2022-12-10  发布在  Python
关注(0)|答案(8)|浏览(172)

我有一个布尔值列表,偶尔我会将它们全部重置为false。在第一次将重置写为:

for b in bool_list:
    b = False

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

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

一切都很好。但是我发现自己在问:“这真的是改变列表中所有元素的最复杂的方法吗?”还有其他更有效或更清晰的方法吗?

czq61nw1

czq61nw11#

如果只有一个对列表的引用,则执行以下操作可能会更容易:

bool_list = [False] * len(bool_list)

这将创建一个用False元素填充的新列表。
类似的例子请参见我对Python字典clear的回答。

44u64gxh

44u64gxh2#

下面是另一个版本:

bool_list = [False for item in bool_list]
jobtbby3

jobtbby33#

总结从性能Angular 来看,numpy或列表乘法是明显的赢家,因为它们比其他方法快10- 20倍。

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

原件:

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

1000圈,三局两胜:每个回路280 usec

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

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

1000圈,三局两胜:每个回路215 usec

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

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

1000圈,三局两胜:每个回路265 usec

枚举

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

1000圈,三局两胜:每个循环385 usec
“小奶包”:

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

10000个循环,三局两胜:每个回路15.9 usec

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

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

10000个循环,三局两胜:每个回路23.3 usec

使用列表乘法替换引用

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

10000个循环,三局两胜:11.3微秒/回路

5jvtdoz2

5jvtdoz24#

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

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

aij0ehis5#

如果你愿意使用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
axzmvihb

axzmvihb6#

我不会使用range和len,使用enumerate()会干净得多

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

在本例中,它只剩下一个未使用的变量,但在我看来,它看起来仍然很干净,性能也没有明显的变化。

avkwfej4

avkwfej47#

对于int、bool和string这样的值类型,第二个例子就像它将要得到的一样漂亮。第一个例子将适用于任何引用类型,如类、字典或其他列表。

iyr7buue

iyr7buue8#

我觉得

bool_list = [False for element in bool_list]

使用这样的列表通常应该比Python中的for循环更快。

相关问题