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が常に私のリストのアイテムになることを知っています(しかし位置ではありません)、そして私はその値を知って前進することによって現在のキーを取得することによって、そのリストの次のアイテムの値を取得する方法を探しています1つ(上記の例で行ったように)またはのようなものを使用してそれを行い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

最も簡単な解決策が与えられていますが、これをリストではなく汎用イテレータで実行したい場合、最も簡単な答えは次を使用すること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 に答える
2

これを使って:

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

これがリストの最後の値である場合、例外が発生することに注意してくださいIndexError

于 2012-10-20T13:21:06.897 に答える
1

オーバーリストを使用indexして特定の値を見つけることができます: -

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