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

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

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

item = "a"

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

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

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

10
задан ROMANIA_engineer 11 October 2017 в 06:24
поделиться

4 ответа

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

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

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

1
ответ дан 3 December 2019 в 23:49
поделиться

В Python 2.6 или выше,

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

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

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

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

Давайте снова посмотрим на итератор:

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

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

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

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

12
ответ дан 3 December 2019 в 23:49
поделиться

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

for i in range(0,len(list)):
    if whatYoureLookingFor in list[i]:
        print i
0
ответ дан 3 December 2019 в 23:49
поделиться
>>> nested_list = [["a", "b"], ["c", "d"]]
>>> item="a"
>>> for o,sublist in enumerate(nested_list):
...     if item in sublist:
...         print o
...
0
0
ответ дан 3 December 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: