Как узнать, принадлежит ли строка к комбинации списков строк в Python? - PullRequest
1 голос
/ 31 октября 2019

У меня есть сложные списки списков списков ... уникальной строки, как показано ниже:

L = [['A'],[['B','C'],['D'],[['E'],['F','G']]]]

Я хотел бы знать, принадлежит ли конкретная строка к L.

Давайте возьмемпростой пример:

L = [['A'],[['B'],['C']]]

Я хотел бы знать, есть ли буква «B» в L (поэтому не список ['B'], а строка 'B'). Как я мог это сделать?

Спасибо

Ответы [ 4 ]

2 голосов
/ 31 октября 2019

Использование рекурсии.

def is_present(string_to_check, nested_list):
    output = False
    for element in nested_list:
         if isinstance(element, list):
             output = output or is_present(string_to_check, element)
         else:
             output = output or string_to_check in element
    return output
1 голос
/ 31 октября 2019

Короче рекурсивное решение:

def exists(d, t):
  return any(i == t if not isinstance(i,list) else exists(i, t) for i in d)


L = [['A'],[['B'],['C']]]
print(exists(L, 'B'))

Вывод:

True
1 голос
/ 31 октября 2019

В вашем случае поиск будет проще, если вы сведете исходный список.

import collections

def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
            yield from flatten(el)
        else:
            yield el

flatten_L = list(flatten(L))

if 'B' in flatten_L:
    print(True)
else:
    print(False)
0 голосов
/ 31 октября 2019

Хотя рекурсивное решение дает правильный результат, оно продолжает без необходимости циклически проходить по остальным элементам списка после того, как найдено совпадение. Это оптимизированная версия, которая, на мой взгляд, более понятна:

def is_present(string_to_check, nested_list):
    for element in nested_list:
        if isinstance(element, list):
            if is_present(string_to_check, element):
                return True
        elif string_to_check in element:
            return True
    return False


L = [['A'],[['B','C'],['D'],[['E'],['F','G']]]]
print(is_present('B', L))

Отпечатки:

True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...