Как извлечь, получить доступ и использовать все значения списка по выбранному индексу подсписка? - PullRequest
2 голосов
/ 29 июня 2019

Мой вопрос - результат проблемы, с которой я сейчас борюсь. Что мне нужно сделать, это использовать что-то вроде этого:

if myString in list[][1]:
   do something

... на такой конструкции:

[
[object1Name, string_1, string_2],
[object2Name, string_1, string_2],
[object3Name, string_1, string_2],
[object4Name, string_1, string_2]
]

Мне нужно проверить, равно ли myString string_1 в каком-либо из элементов списка верхнего уровня и (позже) также получить индекс элементов списка верхнего уровня, которые удовлетворяют условию.

Мне известно, что я могу реализовать это, используя дополнительный цикл for с оператором if внутри, чтобы циклически проходить по всем элементам в списке верхнего уровня, но я не хочу этого избегать. Я хочу однострочник, желательно с "in", но если это невозможно, ничего другого.

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

1 Ответ

4 голосов
/ 29 июня 2019

Вы должны использовать any(..) здесь:

if any(myString == sublist[1] for sublist in lst):
    # ... do something
    pass

для итерируемого словаря, он точно такой же, за исключением того, что ключ может быть нецелым, как:

if any(myString == subdict[some_key] for subdict in lst):
    # ... do something
    pass

Здесь мы, таким образом, перебираем sublist s в lst. Если для одного из sublist s, myString == sublist[1], это будет успешно, в противном случае произойдет сбой.

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

РЕДАКТИРОВАТЬ : Мы можем получить первый индекс с помощью:

idx = next((idx for idx, sublist in enumerate(lst) if myString == sublist[1]), None)

это вернет None, если такого индекса нет.

или мы можем получить все индексы с пониманием списка:

idcs = [idx for idx, sublist in enumerate(lst) if myString == sublist[1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...