my_list = ['apple', 'pear', 'orange', 'raspberry']
# I know that I'm always looking for pear.
print 'pear' in my_list # prints True
# I want to be able to get a key by its value.
pear_key = my_list['pear'].key # should be 1
# Print the next item in the list.
print my_list[pear_key + 1] # should print orange
我知道pear
将永远是我列表中的一个项目(虽然不是位置),我正在寻找一种方法来获取该列表中下一个项目的值,或者通过获取当前密钥通过了解其值并将其推进一个(就像我在上面的示例中所做的那样)或使用my_list.next
之类的东西。
答案 0 :(得分:5)
try:
pos = my_list.index('pear')
print my_list[pos + 1]
# orange
except IndexError as e:
pass # original value didn't exist or was end of list, so what's +1 mean?
你当然可以通过使用它来预先缓存它(认为它可能是itertools对配方)
from itertools import tee
fst, snd = tee(iter(my_list))
next(snd, None)
d = dict(zip(fst, snd))
但是你失去了它是否在原始列表中,或者只是没有合乎逻辑的下一个值的事实。
答案 1 :(得分:2)
使用此:
>>> my_list[my_list.index('pear') + 1]
'orange'
请注意,如果这是列表中的最后一个值,则会出现例外IndexError
。
答案 2 :(得分:2)
虽然给出了最简单的解决方案,但如果你想在通用迭代器而不是列表上执行此操作,最简单的答案是使用itertools.dropwhile()
:
import itertools
def next_after(iterable, value):
i = itertools.dropwhile(lambda x: x != value, iterable)
next(i)
return next(i)
可以这样使用:
>>> next_after(iter(my_list), "pear")
'orange'
请注意,如果您正在处理列表,这是一个速度较慢且不太可读的解决方案。这只是另一种情况的说明。
您还可以生成包含更多描述性错误的版本:
def next_after(iterable, value):
i = itertools.dropwhile(lambda x: x != value, iterable)
try:
next(i)
except StopIteration:
raise ValueError("{} is not in iterable".format(repr(value)))
try:
return next(i)
except StopIteration:
raise ValueError("{} is the last value in iterable".format(repr(value)))
答案 3 :(得分:1)
您可以使用index
列表来查找特定值: -
try:
print my_list[my_list.index('pear') + 1]
except (IndexError, ValueError), e:
print e