从列表变量开始:
number=[1,2,3,None,4,5]
我可以采用两种不同的方法得到相同的结果:
方法1:
result=[number for number in numbers if number]
方法2:
result=[]
for number in numbers:
if not number: continue
result.append(number)
方法2除了将更多代码放在一起之外,执行起来要慢30%。 由于方法1在速度和清晰度部门都获胜,我想更频繁地使用它。
两个问题:
问题1:
我可以使用[i for i in m if i]
方法构建字典变量吗?
所以,如果我从列表变量开始:
number=[1,2,3,None,4,5]
如何进入字典,其中每个列表变量号都成为字典键: 如:
result={1:None, 2:None, 3:None, 4:None, 5:None}
甚至:
result={1:{}, 2:{}, 3:{}, 4:{}, 5:{}}
问题2:
如果满足某个条件,我可以break
来自[i for i in m if i]
次迭代吗?例如:
result=[]
for number in numbers:
if not number: continue
if number==5:
result.append(number)
break
显然我不能这样说:
result=[number for number in numbers if number and number==5 break]
第三个红利问题:[i for i in m if i]
迭代的输出总是列表吗?如果没有,请发一些例子。
答案 0 :(得分:3)
问题1:你可以这样做:
result = {i: None for i in number if i}
或者:
result = {i: {} for i in number if i}
问题2:您可以使用itertools.takewhile
:
result = [i for i in itertools.takewhile(lambda n: bool(n), number)]
问题3:如果你这样写,那么是的。但是如果你写(i for i in number if i)
那么它就不是一个列表。在这种情况下,它是一个生成器表达式:
>>> t = (i for i in number if i)
>>> t
<generator object <genexpr> at 0x106039dc0>
这意味着您可以在不构建列表的情况下将其用于迭代(for item in t:
)。您也可以通过调用list(t)
将其转换回列表。