获取没有len的前一个对象(列表)

时间:2015-05-21 10:20:09

标签: python list

如何使用这种格式的代码获取上一个或下一个对象?

alignment = [[a,b,c],[2,3,4],[q,w,e]]

for obj in alignment:
    some code here to get previous object

我知道怎么做:

for i in range(0,len(alignment)):
    alignment[i-1][objIndex]

3 个答案:

答案 0 :(得分:12)

您可以使用enumerate

alignment = [[a,b,c],[2,3,4],[q,w,e]]

for index,obj in enumerate(alignment):
    alignment[index-1] # pre
    alignment[index+1] # next

注意作为访问next项并拒绝多重索引的更有效方法,您可以使用iter()函数从列表中创建迭代器对象(来自第二个元素结束)并使用next访问每次迭代中的下一个元素:

>>> l=[1,2,3,4]
>>> it=iter(l[1:])
>>> for i in l :
...   print i,next(it,None)
... 
1 2
2 3
3 4
4 None

注意如果您未将None作为第二个参数传递给next()函数,则会引发StopIteration错误。您可以也可以使用try-except语句来处理它。

同样对于短名单,您可以使用zip函数和长列表itertools.izip() function(python 3中的zip):

>>> for i,j in zip(l,l[1:]):
...   print i,j
... 
1 2
2 3
3 4

zip(l,l[1:])会为您提供以下几项:

[(1, 2), (2, 3), (3, 4)]

并且在循环中,您可以使用i作为当前项目,然后j将成为下一个项目,或者使用j作为当前项目,然后i将是之前的项目!:)

答案 1 :(得分:1)

根据您对邻居条目的使用情况,有许多不同的选项。例如,如果您只想处理对,而不是修改列表:

for left,right in zip(somelist[:-1], somelist[1:]):
  pass

或者,如果您需要保留先前的条目作为参考:

prev = None
for item in somelist:
  pass
  prev = item

None此处用于代替第一项的先前项目,类似于它在Kasra的基于iter()的示例中用于下一项之后的下一项目。

答案 2 :(得分:0)

for index, obj in enumerate(alignment):
    alignment[index-1]

循环将为索引和对象提供前一个对象可以被(当前索引 - 1)访问而下一个对象可以访问(当前索引+ 1)