我几乎没有学习python并试图编写一些代码,但是在尝试访问列表中的下一个元素的某些问题上运行。
以下是我的代码的一部分:
for word2 in vocab_list:
index2 = 0
for elem in sentence2:
if (elem == word2 and nextElem == nextWord2)
do something
index2 += 1
问题出在nextElem
和nextWord2
,如果我在当前的迭代中,如何访问它们?
答案 0 :(得分:7)
您可以使用zip
,这也会阻止您访问IndexError
:
for word2, nextWord2 in zip(vocab_list, vocab_list[1:]):
for elem, nextElem in zip(sentence2, sentence2[1:]):
if (elem == word2 and nextElem == nextWord2)
#Do something
<强>演示:强>
>>> lis = range(5)
>>> for item, next_item in zip(lis, lis[1:]):
... print item, next_item
...
0 1
1 2
2 3
3 4
请注意zip
返回一个列表,因此如果zip
的输入数据很大,那么最好使用itertools.izip
,因为它返回一个迭代器。而不是使用itertools.tee
切片获取迭代器。
在演示中,您可以看到循环zip
在item=3
处停止,这是因为zip
与最短的可迭代短路。如果您希望输出为4, some_default_value
,则使用itertools.izip_longest
,它允许您为较短的迭代中的缺失项提供默认值。
答案 1 :(得分:3)
如果您按照实际元素的数组的索引号进行迭代,则可以访问列表的任何成员:
for i in range(len(vocab_list)-1):
for j in range(len(sentence)-1):
if(vocab_list[i]==sentence[j] and vocab_list[i+1]==sentence[j+1]):
print "match"
答案 2 :(得分:1)
存储之前的字样:
prev2 = None
for word2 in vocab_list:
prev = None
for elem in sentence2:
if prev == prev2 and elem == word2:
# do something
prev = elem
prev2 = word2
向后看比向前看容易得多。
对于使用索引,您始终可以使用enumerate()
函数向循环添加索引;你可以在这种情况下向前看:
表示j,word2表示枚举(vocab_list): for i,elem in enumerate(sentence2): 如果i + 1&lt; len(sentence2)和j + 1&lt; LEN(vocab_list): nextElem = sentence2 [i + 1] nextWord2 = vocab_list [j + 1]
但跟踪前一个元素会更容易。