【问题标题】:python - iterating over a subset of a list of tuplespython - 迭代元组列表的子集
【发布时间】:2013-08-08 16:35:15
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 嗯,请注意:永远不要使用 l (ell) 作为符号。同样O(哦)。

标签: python


【解决方案1】:

您可以使用列表推导:

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

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

for tup in ( x for x in l if x[1] == 1 ):
    ...

【讨论】:

  • 该 genexp 的可读性远低于等效的 if 语句。这似乎是个坏主意。
【解决方案2】:

怎么样

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

ones = filter(lambda x: x[1] == 1, l)

【讨论】:

    【解决方案3】:

    只需使用if。简单明了。

    for x, y in tuples:
        if y == 1:
            do_whatever_with(x)
    

    【讨论】:

    • “我可以在循环中使用 if 条件来做到这一点,但我希望有一种更 Python 的方式来做到这一点?”
    • Pythonic的方式来做到这一点。生成器和列表推导对于它们的预期目的来说很好,但如果你真的想迭代某些东西而不是构建一个可迭代的,这是要走的路。老实说,你能说循环遍历一个 genexp 更具可读性吗?
    【解决方案4】:

    在其上构建一个生成器:

    has_1 = (tup for tup in l if l[1] == 1)
    for item in has_1:
        pass
    

    【讨论】:

      【解决方案5】:
      for e in filter(l, lambda x: x[1] == 1):
          print e
      

      【讨论】:

        【解决方案6】:

        试试这个,使用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)

        【讨论】:

          【解决方案7】:

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

          from itertools import ifilter
          iter = ifilter(lambda x: x[1] == 1, l)
          for item in iter:
              pass
          

          【讨论】:

          • 这不是一个很好的解决方案,因为可以方便地在if 子句中捕获测试。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-30
          • 1970-01-01
          • 1970-01-01
          • 2022-12-31
          • 2018-04-07
          • 2018-05-26
          相关资源
          最近更新 更多