列表中的重叠序列

时间:2019-03-03 00:47:35

标签: python python-3.x string

给出了字符串列表,我如何找到重叠的序列

arr=['iloveapple','banana','ilove','ban']
substring_list=[]
for idx,s in enumerate(arr):
    if idx==0:
        substring_list.append(s)
    else:
        if any(s in x for x in substring_list):
            continue
        else:
            substring_list.append(s)


print(substring_list)

当列表变大(> 1000)时,此方法非常慢。有没有更好的方法来解决这个问题。还是有更好的数据结构来存储这些重叠序列

4 个答案:

答案 0 :(得分:2)

您可以将arr中给定字符串的所有可能的子字符串添加到seen集合中,以便您可以查看arr中的新单词是否为的子字符串。任何以前的具有 O(1)时间复杂度的字符串:

seen = set()
substring_list = []
for s in arr:
    if s not in seen:
        substring_list.append(s)
    seen.update({s[i:i + n + 1] for n in range(len(s)) for i in range(len(s) - n)})

substring_list变为:

['iloveapple', 'ilovebanana']

答案 1 :(得分:1)

您可以通过列表理解来执行此操作,而跳过整个列表构建部分。

#make sure to sort the list first
arr = sorted(arr, key = len)
print([s for i, s in enumerate(arr) if all(s not in _ for _ in arr[i + 1:])])
#['iloveapple', 'ilovebanana']

答案 2 :(得分:0)

如果我正确理解了您的问题,我认为您需要后缀树。它们是最有效的字符串匹配数据结构。您可以以此为基础确定列表中的哪个字符串与其他字符串重叠。

from suffix_trees import STree

arr=['iloveapple','banana','ilove','ban']

suffix_arr = "".join(arr)

st = STree.STree(suffix_arr)

for i, s in enumerate(arr):
    overlapped_index = st.find_all(s)
    for index in overlapped_index:
        print(arr[i], " overlaps ", index,  suffix_arr[index:] )

答案 3 :(得分:0)

您可以尝试让字符串函数为您工作:

  arr=['iloveapple','banana','ilove','ban']
  allStrings = " ".join(arr)
  substring_list = [ s for s in arr if len(allStrings.split(s))>2 ]

将所有字符串连接在一起(使用分隔符)将使您可以搜索单个文本池。知道每个字符串至少存在一个,因此,如果只有一个实例,那么在任何一个关键字上拆分组合字符串应该只给出两个部分。但是,如果存在重叠,则较小的关键字会出现多次,并导致其他拆分。