【发布时间】:2013-08-08 16:35:15
【问题描述】:
假设我有一个 元组列表,如下所示
l = [(4,1), (5,1), (3,2), (7,1), (6,0)]
我想遍历元组中第二个元素为 1 的项目?
我可以在循环中使用 if 条件来做到这一点,但我希望会有一种更喜欢 pythonic 的方式来做到这一点?
谢谢
【问题讨论】:
-
嗯,请注意:永远不要使用
l(ell) 作为符号。同样O(哦)。
标签: python
假设我有一个 元组列表,如下所示
l = [(4,1), (5,1), (3,2), (7,1), (6,0)]
我想遍历元组中第二个元素为 1 的项目?
我可以在循环中使用 if 条件来做到这一点,但我希望会有一种更喜欢 pythonic 的方式来做到这一点?
谢谢
【问题讨论】:
l (ell) 作为符号。同样O(哦)。
标签: python
您可以使用列表推导:
[ x for x in l if x[1] == 1 ]
您也可以使用生成器语法迭代元组:
for tup in ( x for x in l if x[1] == 1 ):
...
【讨论】:
if 语句。这似乎是个坏主意。
怎么样
ones = [(x, y) for x, y in l if y == 1]
或
ones = filter(lambda x: x[1] == 1, l)
【讨论】:
只需使用if。简单明了。
for x, y in tuples:
if y == 1:
do_whatever_with(x)
【讨论】:
在其上构建一个生成器:
has_1 = (tup for tup in l if l[1] == 1)
for item in has_1:
pass
【讨论】:
for e in filter(l, lambda x: x[1] == 1):
print e
【讨论】:
试试这个,使用list comprehensions是解决问题的pythonic方法:
lst = [(4,1), (5,1), (3,2), (7,1), (6,0)]
[(x, y) for x, y in lst if y == 1]
=> [(4, 1), (5, 1), (7, 1)]
注意我们如何使用元组解包x, y 来获取对中的每个元素,以及条件if y == 1 如何仅过滤出对中第二个元素中值为1 的元素。之后,您可以对找到的元素做任何您想做的事情,特别是,我正在重建左侧这部分中的原始对:(x, y)
【讨论】:
既然你想迭代,itertools.ifilter 是一个不错的解决方案:
from itertools import ifilter
iter = ifilter(lambda x: x[1] == 1, l)
for item in iter:
pass
【讨论】:
if 子句中捕获测试。