从列表中获取所有连续的二元组的Pythonic方式

7

我有一个由单词组成的列表作为句子,我正在尝试从中提取所有的二元组(即所有连续的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)],然后对其进行迭代,但我认为还有更符合Python规范的方法。

3个回答

7

你在使用 zip 方面走在了正确的道路上。我建议使用列表切片而不是综合。

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

结果:

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

请注意,zip的参数长度不必相同,因此seqseq[1:]长是可以的。

如果seq是一个set(),我应该使用zip(list(seq), list(seq)[1:])还是有更好的方法? - ppw0
@ppw0 首先,需要注意的是:集合是无序的。从语义上讲,你不应该试图从一个集合中获取“连续的项”,因为它可能对哪些项是连续的没有一致的看法。但如果你仍然想尝试,我建议使用 wim 的解决方案,因为它不像我的解决方案那样依赖于切片。 - Kevin

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)

0

使用切片而不是使用range进行索引的相同思路

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

不需要使用[:-1](它会创建一个不必要的列表切片),因为zip会截断较短的参数。 - jonrsharpe
哦,不知道呢!学到了新东西,谢谢。 - Cory Kramer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接