Индекс элемента в списке, когда известна только часть элемента - PullRequest
0 голосов
/ 11 января 2010

Это продолжение моего предыдущего вопроса относительно поиска в списках списков

У меня есть список с парами значений в виде списков в нем.

[['a', 5], ['b', 3], ['c', 2]]

Я знаю первый элемент каждой пары, но не знаю второй (это результат вычисления и сохраняется в списке с первым элементом. Я отсортировал список в порядке убывания вычисляемого элемента.

Я хочу знать, в каком положении находится каждый из предметов, который обычно будет: list.index('a') если бы у меня там не было номеров. Есть ли способ получить номер индекса, не зная всего элемента?

Что-то вроде: list.index(['a',?]) где ? подстановочный знак?

Или я должен просто создать новый список из упорядоченного списка только с первым элементом, чтобы получить его индекс?

Ответы [ 5 ]

5 голосов
/ 11 января 2010
[x[0] for x in list].index('a')

Но если вы запускаете этот код несколько раз, возможно, вы захотите сохранить список из x [0].

4 голосов
/ 11 января 2010

Есть решение, подобное Офрису

D = dict([ [x[1][0],  x[0] ] for x in list(enumerate(L)) ])
D['a']
#returns 0

Но еще одна приятная особенность заключается в том, что если вы немного подправите эту настройку, вы сможете извлечь свои исходные значения

D = dict([ [x[1][0],  (x[0], x[1][1] ) ] for x in list(enumerate(L)) ])
D['a'][0]
#returns 0
D['a'][1]
#returns 5
2 голосов
/ 11 января 2010

У вас уже есть исходный список, из которого вы знаете первые элементы. Список называют его orig_list. Получить индекс элемента из исходного списка и использовать этот индекс в новом списке для извлечения.

>>> orig_list = ['a','b','c']
>>> calc_list = [['a',5], ['b',3], ['c',2] ]

>>> calc_list[orig_list.index('a')]
['a',5]
2 голосов
/ 11 января 2010

Простая, гибкая однострочная версия:

[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a']
# returns [0, 2]

[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a'][0]
# returns 0

Вы можете обернуть его в функцию, заменить item[0] == 'a' вызовом произвольного предиката (как в моем исходном ответе; вот где он гибок) и т. Д. Вторая версия выше выдает исключение, если элемент не найден так что заверните его в try / исключением; первый вернет пустой список.


Если вы предпочитаете отдельную функцию для работы, ознакомьтесь с приведенной ниже ... Она имеет преимущество в том, что потребляет только столько итераций, сколько необходимо , чтобы найти подходящий элемент.

Оригинальный ответ:

Это позволит вам найти индекс первого элемента, обладающего любым свойством, о котором вы только можете подумать, хотя вам нужно будет выразить его как функцию (для вашего примера достаточно lambda x: x[0] == 'a'):

def index_by(pred, iterable):
    i = 0
    found = False
    for item in iterable:
        if pred(item):
            found = True
            break
        i += 1
    return i if found else None

Звоните так:

index_by(lambda x: x[0] == 'a', [('b', 1), ('a', 5)]) # returns 1

чтобы получить нулевой индекс первого элемента в итерируемой, который удовлетворяет данному предикату. (Другими словами, первый элемент в итерируемом элементе передается как второй аргумент, для которого функция, переданная в качестве первого аргумента, возвращает истинное значение.)

Если итеративный элемент не содержит элемент, удовлетворяющий предикату, возвращается None.

1 голос
/ 11 января 2010

Приведенный ниже код получит индексы всех элементов в списке, которые соответствуют шаблону ['a', ?]:

>>> l = [['a',5], ['b',3], ['c',2], ['a',8]]
>>> indexes = [l.index(x) for x in l if x[0] == 'a']
>>> print indexes
[0, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...