【问题标题】:Pythonic way of getting all consecutive 2-tuples from list从列表中获取所有连续 2 元组的 Pythonic 方式
【发布时间】:2015-02-06 09:08:44
【问题描述】:

我有一个句子作为单词列表,我正在尝试从中提取所有的二元组(即所有连续的单词的 2 元组)。所以,如果我的句子是

['To', 'sleep', 'perchance', 'to', 'dream']

我想出去

[('To', 'sleep'), ('sleep', 'perchance'), ('perchance', 'to'), ('to', 'dream')]

目前,我正在使用

zip([sentence[i] for i in range(len(sentence) - 1)], [sentence[i+1] for i in range(len(sentence) - 1)] 然后对其进行迭代,但我不禁想到还有更多 Pythonic 方法可以做到这一点。

【问题讨论】:

    标签: python


    【解决方案1】:

    zip 让您走在正确的轨道上。我建议使用列表切片而不是推导式。

    seq = ['To', 'sleep', 'perchance', 'to', 'dream']
    print zip(seq, seq[1:])
    

    结果:

    [('To', 'sleep'), ('sleep', 'perchance'), ('perchance', 'to'), ('to', 'dream')]
    

    注意zip 的参数不必是相同的长度,所以seq 的长度可以大于seq[1:]

    【讨论】:

    • 如果 seq 是一个 set() 怎么办?我应该使用 zip(list(seq), list(seq)[1:]) 还是有更好的方法?
    • @ppw0 首先,请注意:sets are unordered。从语义的角度来看,您不应该尝试从集合中获取“连续的项目”,因为它可能对其中哪些项目是连续的没有一致的意见。但如果你还想尝试,我建议使用 wim 的解决方案,因为它不像我的那样依赖切片。
    【解决方案2】:

    这是我之前准备的。它来自官方 python 文档中的itertools recipes section

    from itertools import tee
    
    def pairwise(iterable):
        """Iterate in pairs
    
        >>> list(pairwise([0, 1, 2, 3]))
        [(0, 1), (1, 2), (2, 3)]
        >>> tuple(pairwise([])) == tuple(pairwise('x')) == ()
        True
        """
        a, b = tee(iterable)
        next(b, None)
        return zip(a, b)
    

    【讨论】:

      【解决方案3】:

      同样的想法,但使用切片而不是使用range 进行索引

      >>> l =['To', 'sleep', 'perchance', 'to', 'dream']
      >>> list(zip(l, l[1:]))
      [('To', 'sleep'), ('sleep', 'perchance'), ('perchance', 'to'), ('to', 'dream')]
      

      【讨论】:

      • 不需要[:-1](它会创建一个不必要的列表切片),因为zip 会截断较短的参数。
      • 哦,不知道!学到了新东西,谢谢。
      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2012-11-25
      • 2011-04-23
      相关资源
      最近更新 更多