在两个列表中高效地查找字谜

2024-09-30 18:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个名为“query”和“data”的列表,它们都包含字符串。我需要计算“查询”中每个字符串的“数据”中有多少个字谜

例如,对于以下两个列表:

查询=['no','result','oh','abc','tempere']

数据=['no'、'on'、'bca'、'oh'、'cba'、'repmet'、'serult'、'pemter'、'tluser'、'tlures'、'Pteem'、'temrep']

输出将是一个dict,其中包含每个单词的字谜计数:

{'no':2,'result':3,'oh':1,'abc':2,'tempere':4}

我有一个使用嵌套循环的初始蛮力解决方案,但我想知道我应该如何进行优化,因为当列表变大时,它非常慢

dict1 = {}
data.sort()
data.sort(key=len, reverse=False)    

for idx in range(len(query)):

    dict1[query[idx]] = 0
    x = sorted(query[idx])

    for idx2 in range(len(data)):
      if len(data[idx2]) > len(query[idx]):
        break

      if data[idx2] == query[idx]:
        dict1[query[idx]] += 1

      elif x == sorted(data[idx2]):
        dict1[query[idx]] += 1

Tags: 数据no字符串列表datalenresultquery
1条回答
网友
1楼 · 发布于 2024-09-30 18:27:45

可以使用Counter对象:

from collections import Counter
query = ['no', 'result', 'oh', 'abc', 'temper']
data = ['no', 'on', 'bca', 'oh', 'cba', 'repmet', 'serult', 'pemter', 'tluser', 'tlures', 'pterem', 'temrep']

counts = Counter(''.join(sorted(word)) for word in data)
anagram_counts = {k:counts[''.join(sorted(k))] for k in query}
print(anagram_counts) #prints {'no': 2, 'result': 3, 'oh': 1, 'abc': 2, 'temper': 4}

这具有线性复杂性,而嵌套循环方法具有二次复杂性。即使不使用计数器对象,也可以获得线性复杂度:一次通过data创建计数字典,然后通过query,使用在第一个循环中构造的字典创建目标字典

相关问题 更多 >