首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:查找存在于两个列表中的给定长度的公共子列表

Python:查找存在于两个列表中的给定长度的公共子列表
EN

Stack Overflow用户
提问于 2018-07-18 04:34:16
回答 3查看 326关注 0票数 3

我必须找到一个高效的python代码来完成以下工作:

找到包含在两个给定列表中的至少一个n连续元素序列。

例如,对于n=3,这两个列表的结果将为['Tom', 'Sam', 'Jill']

lst1 = ['John', 'Jim', 'Tom', 'Sam', 'Jill', 'Chris']
lst2 = ['Chris', 'John', 'Tom', 'Sam', 'Jill', 'Jim']

下面的示例代码做到了这一点,但如果我必须比较数十万行/列表,它将永远做同样的事情。任何关于如何优化此代码的性能以处理大量数据的建议都将不胜感激!

lst1 = ['John', 'Jim', 'Tom', 'Sam', 'Jill', 'Chris']
lst2 = ['Chris', 'John', 'Tom', 'Sam', 'Jill', 'Jim']
strNum = 3 #represents number of consecutive strings to search for
common_element_found = 'False'
common_elements = []

lst1length = len(lst1) - (strNum - 1)
lst2length = len(lst2) - (strNum - 1)
for x in range(lst1length):
    ConsecutiveStringX = lst1[x] + ' ' + lst1[x + 1] + ' ' + lst1[x + 2]
    for y in range(lst2length):
        ConsecutiveStringY = lst2[y] + ' ' + lst2[y + 1] + ' ' + lst2[y + 2]
        if ConsecutiveStringY == ConsecutiveStringX:
            common_element_found = 'True'
            common_elements.append(ConsecutiveStringY)
            print('Match found: ' + str(common_elements)) 
            break
    if common_element_found == 'True':
        common_element_found = 'False'
        break
EN

回答 3

Stack Overflow用户

发布于 2018-07-18 05:13:34

您可以使用集合:

>>> {tuple(lst1[i:i+3]) for i in range(0,len(lst1)-2)} & {tuple(lst2[i:i+3]) for i in range(0,len(lst2)-2)}
{('Tom', 'Sam', 'Jill')}
票数 0
EN

Stack Overflow用户

发布于 2018-07-18 05:29:31

您可以使用常规表达式:

import re

re.search("((?:\w+ ){3}).*\\1"," ".join(lst1)+","+" ".join(lst2)).group(1)

'Tom Sam Jill'
票数 0
EN

Stack Overflow用户

发布于 2018-07-18 05:52:32

n = 3

stringlst2 = '#'.join(lst2)
for ngram in [lst1[i:i+n] for i in range(len(lst1)-n+1)]:
    if '#'.join(ngram) in stringlst2:
        print(ngram)
        break
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51389795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档