2
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.

4

4 回答 4

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))

但是你会失去它是否在原始列表中,或者只是没有逻辑下一个值的事实。

于 2012-10-20T13:21:24.653 回答
2

用这个:

>>> my_list[my_list.index('pear') + 1]
'orange'

请注意,如果这是列表中的最后一个值,则会出现异常IndexError

于 2012-10-20T13:21:06.897 回答
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)))
于 2012-10-20T13:25:55.727 回答
1

您可以使用indexover list 来查找特定值:-

try:
    print my_list[my_list.index('pear') + 1]
except (IndexError, ValueError), e:
    print e
于 2012-10-20T13:21:33.233 回答