我需要访问前两个和后两个元素(如果存在)。
例如[..., a, b, c, d, e, ..]
- >对于c
我需要abcde
。
这对于列表中间的元素很容易,但在开头和结尾会导致Index超出范围错误。如果列表较小,则会变得更加复杂。
对于所有案例,我可以使用大量if
- elif
- elif
- else
语句来完成此操作,但有没有简洁优雅的方法完成这个?
我正在使用python 2.7
答案 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
出现两次。在这种情况下,它不使用第二个索引。