Поиск двумерного кортежа / списка в Python - PullRequest
4 голосов
/ 05 февраля 2010

Я хочу найти tuple of tuples для конкретной строки и вернуть индекс родительского кортежа. Кажется, я часто сталкиваюсь с вариантами такого поиска.

Какой самый питонный способ сделать это?

т.е:

derp = (('Cat','Pet'),('Dog','Pet'),('Spock','Vulcan'))
i = None
for index, item in enumerate(derp):
    if item[0] == 'Spock':
         i = index
         break
>>>print i
2

Я мог бы обобщить это в небольшую служебную функцию, которая принимает итерацию, индекс (в этом примере я жестко прописал 0) и значение поиска. Это делает свое дело, но у меня есть представление, что, вероятно, для этого есть одна строчка;)

т.е:

def pluck(iterable, key, value):
    for index, item in enumerate(iterable):
        if item[key] == value:
             return index
    return None

Ответы [ 5 ]

4 голосов
/ 12 ноября 2012

Или вы можете сделать:

dict(derp)[<key_name>]

например.

dict(derp)['Cat']

, который даст вам 'Pet'

4 голосов
/ 05 февраля 2010

Это делает свое дело, но у меня есть представление, что, вероятно, для этого есть одна строка;)

Однострочник, вероятно, не питонский способ сделать это:)

Метод, который вы использовали, выглядит хорошо.

Редактировать

Если хочешь быть милым:

return next( (i for i,(k,v) in enumerate(items) if k=='Spock'),None)

next принимает выражение генератора и возвращает следующее значение или второй аргумент (в данном случае None), когда генератор был исчерпан.

1 голос
/ 05 февраля 2010

Если вы часто ищете один и тот же кортеж, вы можете создать диктат.

lookup_table = dict((key, i) for i, (key, unused) in enumerate(derp))

print lookup_table['Spock']
--> 2
0 голосов
/ 28 января 2011

Другой способ получить его в одну строку:

[d[0] for d in derp].index("Spock")

Я не уверен, что итератор оценивает все значения перед вызовом index, и поэтому неэффективен.

0 голосов
/ 05 февраля 2010

Лямбды это весело!

return reduce(
    lambda x,(i,(a,b)): i,
    filter(
        lambda (i,(a,b)): a == "Spock",
        enumerate(depr)
    ),
    None
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...