繁体   English   中英

如何通过重叠的列表对向后迭代?

[英]How can I iterate backwards through overlapping pairs of a list?

我有一个像lst = ["Namaste", "Hello", "Ciao", "Salut"]这样的列表。 我想反向迭代重叠的值对,打印每一对,以获得:

Ciao, Salut
Hello, Ciao
Namaste, Hello

知道我可以使用zip(lst, lst[1:])向前迭代。 但是,如果我尝试在zip object 上简单地使用reversed来向后迭代:

lst = ["Namaste", "Hello", "Ciao", "Salut"]

for curr, nxt in reversed(zip(lst, lst[1:])):
    print(f'{curr}, {nxt}')

我收到一条错误消息, TypeError: 'zip' object is not reversible

我怎样才能实现我的目标?

您可以使用zip

l = ["Namaste", "Hello", "Ciao", "Salut"]

for a,b in zip(l[-2::-1], l[::-1]):
    print(f'{a}, {b}')

output:

Ciao, Salut
Hello, Ciao
Namaste, Hello

我的代码有点大,但它可以工作:

li = ["namaste", "hello", "ciao", "salut",'aymen','khalid']
if len(li)%2 != 0:
    li.append("")
for names in range(0,len(li),2):
    if names%2 == 0:
        print(li[names],li[names+1])
else:
    print(li[names])

zip创建的迭代器无法撤消,因为zip可以接受任何类型的可迭代 - 包括迭代元素将按需确定的迭代器,并且可能是无限的。 (回想一下,在 Python 中,迭代器是一种可迭代的。)

因此,对输入的反向迭代根本不可能; 如果可能的话, zip无法知道“从哪里开始”(例如,给定一个列表迭代器,没有简单的方法来访问原始列表,即使迭代器可能在内部持有一个引用)。

但是,如果已知输入是可逆的,我们可以在压缩之前简单地反转每个输入:

>>> lst = ["Namaste", "Hello", "Ciao", "Salut"]
>>> for curr, nxt in zip(reversed(lst[:-1]), reversed(lst)):
...     print(f'{curr}, {nxt}')
... 
Ciao, Salut
Hello, Ciao
Namaste, Hello

注意切片与前向迭代版本不同:对于curr迭代器,我们必须显式跳过列表的最后一个元素,因为迭代将从末尾开始,但next迭代器可以用原始列表创建——我们不不需要删除列表的第一个元素,因为它不会配对。 这与向前迭代时的工作方式相反。

同样,如果我们从实际序列开始,我们可以创建反向序列并对其进行迭代。 最简单的方法是通过切片,获得“偏移量”迭代器的最简单方法是将偏移量切片两次而不是进行偏移量数学运算:

>>> for curr, nxt in zip(lst[::-1][1:], lst[::-1]):
...     print(f'{curr}, {nxt}')
... 
Ciao, Salut
Hello, Ciao
Namaste, Hello

同样,因为我们反向迭代,所以它是第一个需要偏移的输入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM