поиск в многомерном списке в python - PullRequest
0 голосов
/ 30 марта 2020

У меня есть список кортежей, а именно F = [(1,2,1), (2,3,0), (1,2,4)].

Если я хочу проверить, существует ли (1,2,1) в F, я использую F.__contains__((1,2,1)).

Но как можно проверить, существует ли в списке (1,2,just any number) или (1,just any number,just any number)?

Я использовал F.__contains__((1,2,True)), но не работал правильно.

Ответы [ 4 ]

1 голос
/ 30 марта 2020

Не используйте специальный метод __contains__ напрямую, как указано здесь другими. Используйте оператор членства in, который выполняет ту же задачу.

Код

F = [(1,2,1), (2,3,0), (1,2,4)]

print((1, 2) in [element[:2] for element in F])  # True
1 голос
/ 30 марта 2020
>>> T = (1, 2)
>>> F = [(1,2,1), (2,3,0), (1,2,4)]
>>> any(filter(lambda x:x[:2]==T, F))
True
0 голосов
/ 30 марта 2020

В комментарии Мухаммед попросил более общий c метод поиска. Вот один из способов сделать это.

from itertools import zip_longest

F = [(1,2,1), (2,3,0), (1,2,4)]

def search_2d_list(needle, haystack):
    def equal_or_none(row):
        return all(q is None or q == i for q, i in zip_longest(needle, row))
    return any(equal_or_none(row) for row in haystack)

Результаты с терминала

>>> search_2d_list((1,), F)
True
>>> search_2d_list((1,2), F)
True
>>> search_2d_list((1,2,1), F)
True
>>> search_2d_list((1,2,3), F)
False
>>> search_2d_list((2,2,3), F)
False
>>> search_2d_list((2,2), F)
False
>>> search_2d_list((2,None,2), F)
False
>>> search_2d_list((2,None,0), F)
True
0 голосов
/ 30 марта 2020
(1, 2) in [x[:-1] for x in F]

Обратите внимание, как уже прокомментировано не использовать содержит непосредственно

...