Python: индексный список для элемента во вложенном списке - PullRequest
10 голосов
/ 09 марта 2010

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

Вот какой-то псевдокод:

item = "a"

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

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

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

Ответы [ 4 ]

12 голосов
/ 09 марта 2010

В Python 2.6 или лучше,

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

при условии, например, Вы хотите получить результат -1, если 'a' отсутствует ни в одном из подсписков.

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

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

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

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

1 голос
/ 09 марта 2010

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

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

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

0 голосов
/ 09 марта 2010
>>> nested_list = [["a", "b"], ["c", "d"]]
>>> item="a"
>>> for o,sublist in enumerate(nested_list):
...     if item in sublist:
...         print o
...
0
0 голосов
/ 09 марта 2010

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

for i in range(0,len(list)):
    if whatYoureLookingFor in list[i]:
        print i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...