我的问题是你在迭代时如何在下一个索引处开始一个列表?
for elem1, elem2 in zip(unigram_mixture_list, bigram_mixture_list):
print elem1, elem2
我想开始在elem1
前面循环一个索引。
我如何在python中实现这一目标?
答案 0 :(得分:4)
使用[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
,因此请改用它。
答案 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。