如何遍历两个列表,其中一个列表进行了偏移?

4
我的问题是,在迭代时如何从下一个索引开始一个列表?
for elem1, elem2 in zip(unigram_mixture_list, bigram_mixture_list):
    print elem1, elem2

我希望从elem1的下一个索引开始循环。

在Python中,我该如何实现这个功能?


我已经编辑了你的问题,使其更加清晰 - 有一些无关的信息使它变得混乱,并没有真正改变问题的意思(只是掩盖了它)。 - sashkello
3个回答

6

使用[1:]切片第一个列表:

for elem1, elem2 in zip(unigram_mixture_list[1:], bigram_mixture_list):

您已经完全正确了。


请注意,如果列表的长度相同,但因为您缩短了一个列表而截断了,那么您有几种选择:

  • 切片第二个列表以删除尾部:[:-1]
  • zip替换为itertools.izip_longest(在import itertools之后)

使用 izip_longest 的示例:

import itertools

# ~~~ other code ~~~ #

for elem1, elem2 in itertools.izip_longest(unigram_mixture_list[1:], bigram_mixture_list):
    print elem1, elem2

编辑:在Python 3中,izip_longest已更名为zip_longest,因此请改用后者。


谢谢,但我想知道为什么我的帖子被Sashkello编辑了?是因为它太过冗长了吗? - Pangu
抱歉我是 Python 新手,我该如何实现这个?很抱歉需要你指导一下 :) - Pangu
抱歉,让我重新表达我的问题,我是在回答你关于切片的问题?...我需要遍历第二个列表中的所有元素,但跳过第一个列表中的第一个元素。 - Pangu
嗨,mhlester,我收到一个错误,说“module”对象没有属性“izip_longest”。 - Pangu
我在使用Python 3.3.3,问题已解决,感谢您的耐心,先生! - Pangu
很高兴为您服务,能够帮助您我感到非常愉快。 - mhlester

2
这里有一种“zip”方法,但如果两个列表的长度相同,则较长的列表将被截断:
>>> li1='abcdefg'
>>> li2='1234567'
>>> zip(li1[1:], li2)
[('b', '1'), ('c', '2'), ('d', '3'), ('e', '4'), ('f', '5'), ('g', '6')]
# NOTE -- '7' is dropped from li2...

使用Python 2,您可以使用map函数:
>>> map(None, li1[1:], li2)
[('b', '1'), ('c', '2'), ('d', '3'), ('e', '4'), ('f', '5'), ('g', '6'), (None, '7')]
# NOTE -- We ran out of li1, so start using 'None'

无论是 Python 2 还是 Python 3,你都可以使用 itertools 中的 izip_longest
>>> from itertools import izip_longest
>>> list(izip_longest(li1[1:], li2))
[('b', '1'), ('c', '2'), ('d', '3'), ('e', '4'), ('f', '5'), ('g', '6'), (None, '7')]

1
哇,map的忍者秘诀! - mhlester
我不能保证我会使用或记住那个,但是学到了就点个赞! - mhlester
@mhlester:你应该忘记你曾经看到它——不幸的是,这个习惯用法在 Python 3 中已经不再起作用了... - dawg

1

more_itertools 提供了一个用于偏移可迭代对象的工具,称为 more_itertools.zip_offset:

import more_itertools as mit


it1 = "0123"
it2 = "abcdef"

for elem1, elem2 in mit.zip_offset(it1, it2, offsets=(1, 0), longest=True):
    print(elem1, elem2)

输出
1 a
2 b
3 c
None d
None e
None f

注意第一个可迭代对象由offsets关键字指定向后偏移1个元素。可选关键字longest会在迭代最长的可迭代对象结束前提供fillvalue。对于您的应用程序,只需替换可迭代对象即可。

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