Python: список индексирования для элемента в вложенном списке

Я знаю, что я ищу. Я хочу, чтобы python сказал мне, в каком списке он находится.

Здесь некоторый псевдокод:

item = "a"

nested_list = [["a", "b"], ["c", "d"]]

list.index(item) #obviously this doesn't work

здесь я бы хотел, чтобы python возвращал 0 (потому что "a" - это элемент в первом под-списке в большем списке). Мне все равно, какой из подэлементов он есть. Мне все равно, есть ли дубликаты, например, [ "a" , "b", "a" ] должны возвращать то же, что и в приведенном выше примере.

Ответ 1

В Python 2.6 или выше

next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1)

предполагая, например, вам нужен результат -1, если 'a' присутствует ни в одном из подписок.

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

Изменить: для каждого запроса позвольте мне объяснить, как это работает. Я использую встроенную функцию (new in 2.6) next, в частности я вызываю next(iterator, default): возвращает следующий элемент итератора (и, следовательно, первого, так как это первый раз, когда мы продвигаем этот итератор) или значение по умолчанию, если итератор завершен (что означает "пустой", если он закончен, прежде чем мы его продвинем;-). По умолчанию ясно, что -1 и возвращается, если "a присутствует ни в одном из подписок", что означает, что в этом случае "итератор пуст".

Посмотрите на итератор снова:

(i for i, sublist in enumerate(nested_list) if "a" in sublist)

(округленные) круглые скобки и слова for и if означают, что это выражение генератора, также известное как краткость как genexp. i (индекс) и sublist (элемент в этом индексе) превышают enumerate(nested_list) - если бы у нас не было enumerate, тогда мы не будем отслеживать индекс, но в этом дело нам нужно. Они рассматриваются только тогда, когда условие if выполняется, то есть когда элемент, который вы ищете, присутствует в текущем подсписке.

Таким образом, этот ген xp производит по одному за раз каждое значение индекса, так что подсвечник в этом индексе удовлетворяет условию "a" in sublist. Поскольку мы используем его внутри next, мы принимаем только первый такой индекс.

OP может быть оправданным, если подумать, что волшебный встроенный, выполняющий все это в трех или четырех символах, будет более удобным - и поэтому для этого очень специфического требования, которое, я считаю, я никогда не встречал раньше десять лет использования Python; однако, если бы у каждого такого конкретного требования был свой собственный очень специализированный встроенный язык и встроенные средства, он вырос бы больше, чем налоговый код. Вместо этого Python предлагает множество низкоуровневых "lego-кирпичей" и несколько удобных способов объединить их вместе, чтобы четко (и разумно сжато) выразить решение комбинаторно большого разнообразия конкретных требований, таких как OP.

Ответ 2

Вам понадобится использовать какую-нибудь петлевую конструкцию:

next((sublist for sublist in mainlist if item in sublist))

Это даст вам генератор для всех подсписок, содержащих нужный элемент, и даст вам первый.

Ответ 3

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

for i in range(0,len(list)):
    if whatYoureLookingFor in list[i]:
        print i

Ответ 4

>>> nested_list = [["a", "b"], ["c", "d"]]
>>> item="a"
>>> for o,sublist in enumerate(nested_list):
...     if item in sublist:
...         print o
...
0