Я знаю то, что я ищу. Я хочу, чтобы Python сказал мне, в каком списке это находится.
Вот некоторый псевдокод:
item = "a"
nested_list = [["a", "b"], ["c", "d"]]
list.index(item) #obviously this doesn't work
здесь я хотел бы, чтобы Python возвратился 0 (потому что элемента в первом подсписке в большем списке). Я не забочусь, какой подэлемент это. Я не забочусь, существуют ли дубликаты, например, ["a", "b", "a"] должен возвратить то же самое как вышеупомянутый пример.
Вам нужно будет использовать какую-то конструкцию цикла:
next((sublist for sublist in mainlist if item in sublist))
Это даст вам генератор для всех подсписок, содержащих нужный вам элемент, и даст вам первый.
В 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.
Просмотрите список, чтобы получить каждый подсписок. Затем проверьте, есть ли элемент в подсписке:
for i in range(0,len(list)):
if whatYoureLookingFor in list[i]:
print i
>>> nested_list = [["a", "b"], ["c", "d"]]
>>> item="a"
>>> for o,sublist in enumerate(nested_list):
... if item in sublist:
... print o
...
0