我有一个带有布尔值的列表,比如
lyst = [True,True,False,True,False]
以及两个不同的列表,例如:
^{pr2}$我只想用car
中的值替换True,用a
中的值替换False。
或者使用来自lyst
的序列和来自car
和a
的值创建一个新列表。
结果应该是
[BMW,VW,b,Volvo,c].
目前我的代码:
for elem1,elem2,elem3 in zip(lyst,car,a):
subelem2=elem2
subelem3=elem3
if elem1 != True:
result_list.append(subelem2)
else:
result_list.append(subelem3)
但这会创建一个长度超过5的列表匹配。在
我该怎么做?在
假设在}个条目,那么您可以通过创建其他两个列表的迭代器来有效地实现这一点。这比列表前面的
lyst
中有正确数量的True
和{pop
更有效。在输出
^{pr2}$selector[b]
构造有效,因为False
的数值为0,True
的数值为1,因此我们可以使用lyst
的布尔值来索引到selector
列表中。在时间安排
我决定编写一个^{} 脚本来比较这里发布的各种算法的速度,以及来自{a2}的vaultah代码。在
为了测试这些算法,我把它们都放到函数中。为了获得精确的计时数据,
timeit
多次运行函数。使用.pop
的算法使用它们弹出的列表,因此我必须向这些函数添加代码以创建这些列表的副本。显然,复制过程会减慢这些函数的速度,在某些应用程序中,输入数据列表被破坏可能无关紧要,但我觉得需要包括复制时间,以便比较这些函数的速度,以便更通用。在timeit
测量的是挂钟时间,而不是CPU时间,因此计时将受到系统上运行的其他进程的影响。因此,在运行timeit
代码时,最好尽可能减少系统负载。理想情况下,您应该关闭netaccess,或者至少避免在测试运行时使用浏览器。绝对不要听音乐或看视频。:)下面的代码运行在python2.6+和python3上。我在python2.6.6和python3.6.0上进行了测试。在
Python 3输出
Python 2输出
这些结果来自我相当古老的32位单核2GHZ机器,2GB的RAM运行着Debian Linux的衍生产品。在
好吧,我忍不住:
^{pr2}$这将使用一些布尔表达式功能:
and
表达式将不计算第二个操作数and
表达式将返回第二个操作数(实际对象)or
表达式将返回第一个计算结果为True的对象一个潜在的问题是}中的任何项的计算结果都为False。同样,这并不像第一个溶液中的三元溶液那么易读。在
car
或{但很有趣。在
我想我会再补充一点,我可能不应该重新分配原始的列表名称-我应该为迭代器名称选择不同的名称。一旦用尽,迭代器就无法重置,并且由于列表名称被重新分配,原始列表信息将丢失。在
相关问题 更多 >
编程相关推荐