Использование метода Python list index () для списка кортежей или объектов? - PullRequest
47 голосов
/ 04 июня 2009

Тип списка 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 () - это просто гипотетический метод, который принимает субиндекс и значение, а затем возвращает индекс элемента списка с заданным значением в этом субиндексе. Я надеюсь

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

Ответы [ 12 ]

0 голосов
/ 04 мая 2016

Тело не предлагает лямбды?

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

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

извлечь все предметы по условию: фильтр (лямбда 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 нормальный текстовый файл _ требуется явное назначение, т.е. _ = фильтр (лямбда-x: x [1] [0] == "pato", перечислять (l))

0 голосов
/ 16 января 2013
z = list(zip(*tuple_list))
z[1][z[0].index('persimon')]
...