6

假设我有一个元组列表如下

l = [(4,1), (5,1), (3,2), (7,1), (6,0)]

我想遍历元组中第二个元素为 1 的项目?

我可以在循环中使用 if 条件来做到这一点,但我希望会有一种更Pythonic的方式来做到这一点?

谢谢

4

7 回答 7

6

您可以使用列表推导:

[ x for x in l if x[1] == 1 ]

您也可以使用生成器语法迭代元组:

for tup in ( x for x in l if x[1] == 1 ):
    ...
于 2013-08-08T16:37:12.767 回答
3

怎么样

ones = [(x, y) for x, y in l if y == 1]

或者

ones = filter(lambda x: x[1] == 1, l)
于 2013-08-08T16:36:46.330 回答
3

只需使用if. 它清晰而简单。

for x, y in tuples:
    if y == 1:
        do_whatever_with(x)
于 2013-08-08T16:38:26.673 回答
2

在它上面构建一个生成器:

has_1 = (tup for tup in l if l[1] == 1)
for item in has_1:
    pass
于 2013-08-08T16:39:33.527 回答
2
for e in filter(l, lambda x: x[1] == 1):
    print e
于 2013-08-08T16:40:22.827 回答
1

试试这个,使用列表推导是解决问题的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)

于 2013-08-08T16:37:05.547 回答
1

既然你想迭代,itertools.ifilter是一个很好的解决方案:

from itertools import ifilter
iter = ifilter(lambda x: x[1] == 1, l)
for item in iter:
    pass
于 2013-08-08T16:39:34.383 回答