繁体   English   中英

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

[英]Python: finding a common sublist of a given length present in two lists

我必须找到一个有效的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

IIUC,

consecs1 = [ tuple(lst1[i:i+3]) for i in range(0, len(lst1)-2)]
consecs2 = { tuple(lst2[i:i+3]) for i in range(0, len(lst2)-2)}

for c in consecs1: 
    if c in consecs2:
         print(c)

产量

('Tom', 'Sam', 'Jill')

说明:您可以让列表tupleslst1 ,这是哈希的对象,检查它们是否insettuples从内置lst2 (其中授予O(1)速度)。

PS:尽管集合是无序的,但是顺序是有保证的,因为循环遵循lst1而不是lst2排序。

你可以使用套装:

>>> {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')}

您可以使用常规表达式:

import re

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

'Tom Sam Jill'
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM