Понимание списка для определения совпадения строк между двумя списками - PullRequest
0 голосов
/ 06 июня 2018

Я использую списочное понимание для фильтрации строк в list_a (большой список), которые содержат любую из строк в list_b (другой большой список).Я смог успешно использовать приведенный ниже код для генерации списка элементов в list_a, которые имеют такие совпадения:

list_a_results = [s for s in list_a if any(xs in s for xs in list_b)]

Теперь я пытаюсь сделать то, о чем я думаю, как об обратномобрабатывать, т. е. идентифицировать каждый элемент из list_b, который отображается в каждой строке, указанной в list_a_results.Есть ли отличный способ использовать списочное понимание для достижения этой цели?

Пример того, что я пытаюсь достичь: когда мне дано:

list_a_results = ['abc def ghi jkl', 'mno pqr', 'stu', 'vwx yz']
list_b = ['abc', 'ghi', 'pqr', 'stu', 'vwx', 'yz']

Я хочу иметь возможность генерироватьследующее:

matches_in_list_a = [['abc', 'ghi'], 'pqr', 'stu', ['vwx','yz']]

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Практически дословное решение: для каждого элемента b из B каждый элемент a из A st a находится в b.

# constant depth result
res = [[s for s in list_b if s in a] for a in list_a_results]
# [['abc', 'ghi'], ['pqr'], ['stu'], ['vwx', 'yz']]

# desired output
itr = ([s for s in list_b if s in a] for a in list_a_results)
res2 = [x.pop() if len(x) == 1 else x for x in itr]
# [['abc', 'ghi'], 'pqr', 'stu', ['vwx', 'yz']]
0 голосов
/ 06 июня 2018

У вас уже есть алгоритм, который вам нравится, кажется, что вы просто хотите сделать это снова!

[s for s in list_b if any(xs in s for xs in list_a_results]

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

def anySubstrings(list_a,list_b):
    return [s for s in list_a if any(xs in s for xs in list_b)]

, и теперь ваш вызов становится:

anySubstrings(list_b,anySubstrings(list_a,list_b))
...