понимание списка для списка в Python - PullRequest
0 голосов
/ 02 мая 2019

У меня есть список списков, и я хочу найти индексы, где встречается '//'.Я знаю, как это сделать, если я использую вложенные циклы, но я хочу использовать списочное понимание.Мой список:

ex = [['foo', 'faa'], ['//', 'sd'], ['foo', 'kaa'], ['side', 'haha', 'blue'], ['//', 'sd']]

Как я могу использовать здесь понимание списка, чтобы найти индексы, где встречается «//»?Пока что я сделал:

indices = [idx for idx, lst in enumerate(ex)]

Это дает мне индексы моих списков в списке.Но я не знаю, как их использовать, чтобы найти индексы для '//' с использованием понимания списка.

Для приведенного выше примера ex ожидаемый результат равен

[1, 4]

, например,индексы для вложенных списков, содержащих '//', которые ex[1] и ex[4].

Ответы [ 2 ]

8 голосов
/ 02 мая 2019

Понимание вложенных списков необходимо, только когда вывод содержит вложенные списки.Постижения списков создают списки, вложения для вложенных списков создают список списков.Здесь вы производите только индексы для каждого вложенного списка, который проходит тест.

Если все, что вы хотите сделать, это проверить наличие строки '//' во вложенном списке, просто используйте фильтрующее выражение ifв понимании списка:

indices = [idx for idx, lst in enumerate(ex) if '//' in lst]

Если вам необходимо узнать, является ли '//' подстрокой какого-либо из значений, тогда это все еще тест фильтра, но с any() функция и выражение генератора:

indices = [idx for idx, lst in enumerate(ex) if any('//' in el for el in lst)]

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

3 голосов
/ 02 мая 2019

Это понимание подойдет:

>>> indices = [idx for idx, lst in enumerate(ex) if "//" in lst]
>>> indices
[1, 4]

Если вы хотите проверить, присутствует ли «//» внутри каких-либо строк в списках:

>>> indices = [idx for idx, lst in enumerate(ex) if any("//" in x for x in lst)]
...