优雅的方式来访问列表中的最后两个和下两个元素?

时间:2014-11-03 16:32:30

标签: python list

我需要访问前两个和后两个元素(如果存在)。 例如[..., a, b, c, d, e, ..] - >对于c我需要abcde

这对于列表中间的元素很容易,但在开头和结尾会导致Index超出范围错误。如果列表较小,则会变得更加复杂。

对于所有案例,我可以使用大量if - elif - elif - else语句来完成此操作,但有没有简洁优雅的方法完成这个?

我正在使用python 2.7

2 个答案:

答案 0 :(得分:4)

只需使用切片(但要注意负面指数):

inputlist[max(0, index - 2):index + 3]

会在index周围为您提供最多5个元素的窗口; 2之前和之后2。

max()调用确保起始索引的上限为0或更高。

这适用于您用于生成索引的任何方法。假设您正在使用循环以及enumerate()来跟踪索引:

def window(inputlist, index):
    return inputlist[max(0, index - 2):index + 3]

for index, elem in enumerate(inputlist):
    print window(inputlist, index)

或者您找到了包含list.index()的元素:

print window(inputlist, inputlist.index('ham'))

演示:

>>> def window(inputlist, index):
...     return inputlist[max(0, index - 2):index + 3]
... 
>>> window(['foo', 'bar', 'baz', 'spam', 'ham', 'eggs'], 1)
['foo', 'bar', 'baz', 'spam']
>>> window(['foo', 'bar', 'baz', 'spam', 'ham', 'eggs'], 2)
['foo', 'bar', 'baz', 'spam', 'ham']
>>> window(['foo', 'bar', 'baz', 'spam', 'ham', 'eggs'], 4)
['baz', 'spam', 'ham', 'eggs']
>>> window(['foo', 'bar', 'baz', 'spam', 'ham', 'eggs'], 5)
['spam', 'ham', 'eggs']

答案 1 :(得分:2)

您希望slice列表

l = ['a','b','c','d','e','f','g','h','i','j']
print l[max(0, l.index('f') - 2):l.index('f') + 3]
['d', 'e', 'f', 'g', 'h']

切片时需要注意的是负索引。

其他一些例子:

print l[max(0, l.index('a') - 2):l.index('a') + 3]
['a', 'b', 'c']

print l[max(0, l.index('j') - 2):l.index('j') + 3]
['h', 'i', 'j']

print l[max(0, l.index('c') - 2):l.index('c') + 3]
['a', 'b', 'c', 'd', 'e']

重要提示:

如果列表中有重复值,index()函数将使用第一个索引值:

l = ['a','b','c','d','e','f','g','h','i','j','f']
print l[max(0, l.index('f') - 2):l.index('f') + 3]
['d', 'e', 'f', 'g', 'h']

请注意f出现两次。在这种情况下,它不使用第二个索引。