如何迭代两个列表,其中一个移位?

时间:2014-02-03 05:34:29

标签: python

我的问题是你在迭代时如何在下一个索引处开始一个列表?

for elem1, elem2 in zip(unigram_mixture_list, bigram_mixture_list):
    print elem1, elem2

我想开始在elem1前面循环一个索引。

我如何在python中实现这一目标?

3 个答案:

答案 0 :(得分:4)

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

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

你还有其他一切正确


请注意,如果列表长度相同,但由于您缩短了列表,现在已被截断,您有几个选择:

  • 切片第二个列表以删除尾部:[:-1]
  • zip替换为itertools.izip_longestimport 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,因此请改用它。

答案 1 :(得分: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和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')]

答案 2 :(得分:0)

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

请注意,第一个iterable由offsets关键字指定的1个元素偏移。可选关键字longest提供fillvalue,直到迭代在最长的可迭代内完成。对于您的应用程序,只需替换iterables。