在迭代中获得一个元素和以下元素的优雅/高效方法

时间:2016-04-01 14:35:03

标签: python list itertools

所以我有一个问题,我有一个像string = "ABCDEFG"这样的可迭代(字符串或列表),我想输出像

这样的东西
A-B
B-C
C-D
...
F-G

所以我知道这有效(忘了处理indexError,但不管怎样),但它很难看......

for i in range(len(myString)):
    element1 = myString[i]
    element2 = myString[i+1]
    print("theshit")

有没有办法以更优雅/ pythonic的方式做到这一点?我认为itertools可以是一个解决方案,但我不知道它是如何工作的。

顺便说一句,我只需要myString这个循环所以也许生成器(不知道如何使用它,我还在学习)

谢谢:)

3 个答案:

答案 0 :(得分:5)

如果您使用序列的尾部(可以使用itertools.izip获得)来压缩序列,那么

itertools.islice可能会有用:

>>> from itertools import islice, izip
>>> iterable = "abcdefg"
>>> for x in izip(iterable, islice(iterable, 1, None)): print x
...
('a', 'b')
('b', 'c')
('c', 'd')
('d', 'e')
('e', 'f')
('f', 'g')

答案 1 :(得分:4)

itertools具有以下配方,可以完全满足您的需求:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

答案 2 :(得分:1)

这是一个选项,但Frenrich的答案肯定是最好的。

我只提及它,因为它可能会在类似的情况下有所帮助

sequence = 'ABCDEFG'
iter_1 = iter(sequence)
iter_2 = iter(sequence)

next(iter_2) # throw away the first value

for a, b in zip(iter_1, iter_2):
    print(a, b)