Использование метода index () списка Python в списке кортежей или объектов?

Тип списка Python имеет метод index (), который принимает один параметр и возвращает индекс первого элемента в списке, соответствующем параметру. Например:

>>> some_list = ["apple", "pear", "banana", "grape"] >>> some_list.index("pear") 1 >>> some_list.index("grape") 3 

Есть ли изящный (идиоматический) способ распространить его на списки сложных объектов, например кортежи? В идеале я хотел бы сделать что-то вроде этого:

 >>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)] >>> some_list.getIndexOfTuple(1, 7) 1 >>> some_list.getIndexOfTuple(0, "kumquat") 2 

getIndexOfTuple () – это всего лишь гипотетический метод, который принимает подиндекс и значение, а затем возвращает индекс элемента списка с заданным значением в этом подиндексе. я надеюсь

Есть ли какой-то способ достичь этого общего результата, используя списки или lambas или что-то вроде «in-line»? Я думаю, что я мог бы написать свой собственный класс и метод, но я не хочу изобретать колесо, если у Python уже есть способ сделать это.

11 Solutions collect form web for “Использование метода index () списка Python в списке кортежей или объектов?”

Как насчет этого?

 >>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)] >>> [x for x, y in enumerate(tuple_list) if y[1] == 7] [1] >>> [x for x, y in enumerate(tuple_list) if y[0] == 'kumquat'] [2] 

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

 >>> [y[0] for y in tuple_list].index('kumquat') 2 

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

Позже эти списки становятся беспорядочными.

Мне нравится этот питоновский подход:

 from operator import itemgetter def collect(l, index): return map(itemgetter(index), l) # And now you can write this: collect(tuple_list,0).index("cherry") # = 1 collect(tuple_list,1).index("3") # = 2 

Если вам нужно, чтобы ваш код был суперэффективным:

 # Stops iterating through the list as soon as it finds the value def getIndexOfTuple(l, index, value): for pos,t in enumerate(l): if t[index] == value: return pos # Matches behavior of list.index raise ValueError("list.index(x): x not in list") getIndexOfTuple(tuple_list, 0, "cherry") # = 1 

Одна из возможностей – использовать функцию itemgetter из модуля operator :

 import operator f = operator.itemgetter(0) print map(f, tuple_list).index("cherry") # yields 1 

Вызов itemgetter возвращает функцию, которая будет делать эквивалент foo[0] для любого переданного ему элемента. Используя map , вы затем применяете эту функцию к каждому кортежу, извлекая информацию в новый список, после чего вы вызываете index как обычно.

 map(f, tuple_list) 

эквивалентно:

 [f(tuple_list[0]), f(tuple_list[1]), ...etc] 

который, в свою очередь, эквивалентен:

 [tuple_list[0][0], tuple_list[1][0], tuple_list[2][0]] 

который дает:

 ["pineapple", "cherry", ...etc] 

Вы можете сделать это со списком и индексом ()

 tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)] [x[0] for x in tuple_list].index("kumquat") 2 [x[1] for x in tuple_list].index(7) 1 

Я бы разместил это как комментарий к Triptych, но я не могу комментировать пока из-за отсутствия рейтинга:

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

 li = [(1,2,3,4), (11,22,33,44), (111,222,333,444), ('a','b','c','d'), ('aa','bb','cc','dd'), ('aaa','bbb','ccc','ddd')] # want pos of item having [22,44] in positions 1 and 3: def getIndexOfTupleWithIndices(li, indices, vals): # if index is a tuple of subindices to match against: for pos,k in enumerate(li): match = True for i in indices: if k[i] != vals[i]: match = False break; if (match): return pos # Matches behavior of list.index raise ValueError("list.index(x): x not in list") idx = [1,3] vals = [22,44] print getIndexOfTupleWithIndices(li,idx,vals) # = 1 idx = [0,1] vals = ['a','b'] print getIndexOfTupleWithIndices(li,idx,vals) # = 3 idx = [2,1] vals = ['cc','bb'] print getIndexOfTupleWithIndices(li,idx,vals) # = 4 

Вдохновленный этим вопросом , я нашел это довольно элегантным:

 >>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)] >>> next(i for i, t in enumerate(tuple_list) if t[1] == 7) 1 >>> next(i for i, t in enumerate(tuple_list) if t[0] == "kumquat") 2 

хорошо, это может быть ошибкой в vals(j) , исправление:

 def getIndex(li,indices,vals): for pos,k in enumerate(lista): match = True for i in indices: if k[i] != vals[indices.index(i)]: match = False break if(match): return pos 
 tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)] def eachtuple(tupple, pos1, val): for e in tupple: if e == val: return True for e in tuple_list: if eachtuple(e, 1, 7) is True: print tuple_list.index(e) for e in tuple_list: if eachtuple(e, 0, "kumquat") is True: print tuple_list.index(e) 
 z = list(zip(*tuple_list)) z[1][z[0].index('persimon')] 

Никакое тело не предлагает лямбда?

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

  l #[['rana', 1, 1], ['pato', 1, 1], ['perro', 1, 1]] map(lambda x:x[0], l).index("pato") #1 

Изменить для добавления примеров:

  l=[['rana', 1, 1], ['pato', 2, 1], ['perro', 1, 1], ['pato', 2, 2], ['pato', 2, 2]] 

извлекать все элементы по условию: filter (lambda x: x [0] == "pato", l) # [['pato', 2, 1], ['pato', 2, 2], ['pato', 2, 2]]

извлекать все предметы по условию с индексом:

  >>> filter(lambda x:x[1][0]=="pato", enumerate(l)) [(1, ['pato', 2, 1]), (3, ['pato', 2, 2]), (4, ['pato', 2, 2])] >>> map(lambda x:x[1],_) [['pato', 2, 1], ['pato', 2, 2], ['pato', 2, 2]] 

Примечание: переменная _ работает только в интерактивном интерпретаторе y нормальный текстовый файл _ требуется explicti assign, то есть _ = filter (lambda x: x [1] [0] == "pato", enumerate (l))

Python list.index (x) возвращает индекс первого вхождения x в список. Таким образом, мы можем передавать объекты, возвращаемые сжатием списка, для получения их индекса.

 >>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)] >>> [tuple_list.index(t) for t in tuple_list if t[1] == 7] [1] >>> [tuple_list.index(t) for t in tuple_list if t[0] == 'kumquat'] [2] 

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

 >>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11), ("banana", 7)] >>> [tuple_list.index(t) for t in tuple_list if t[1] == 7] [1, 4] 
  • Python: Что здесь означает использование ?
  • Понимание вложенного списка
  • Как вычислить среднее значение в python?
  • Эффективная альтернатива "в"
  • Создание списка с> 255 элементами
  • Переупорядочить список точек для достижения кратчайшего расстояния между ними
  • Сортировка элементов с определенным порядком в python
  • Как передать список как вход функции в Python
  • Python - лучший язык программирования в мире.