python - 在两个列表中有效地查找字谜
问题描述
我有两个名为“查询”和“数据”的列表,它们都包含字符串。我需要计算“数据”中有多少“查询”中每个字符串的字谜。
例如以下两个列表:
查询= ['否','结果','哦','abc','脾气']
数据= ['no','on','bca','oh','cba','repmet','serult','pemter','tluser','tlures','pterem','temrep' ]
输出将是一个字典,其中包含每个单词的字谜计数:
{'no': 2, 'result': 3, 'oh': 1, 'abc': 2, 'temper': 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
解决方案
您可以使用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}
这具有线性复杂性,而您的嵌套循环方法具有二次复杂性。即使不使用 Counter 对象,您也可以获得线性复杂度:一次通过data
创建计数字典,随后通过query
,使用在第一个循环中构造的字典创建目标字典。
推荐阅读
- c# - 读取kml文件以获取c#中的坐标
- jquery - 旋转 Twitter Bootstrap4 导航栏菜单/子菜单插入符号
- java - 如何用不同的值替换多个字符?
- stan - 在 Stan 中编写自定义 Probit 函数
- ruby - 带有命名参数的 Ruby 函数如何用散列代替?
- python - 如何在 Python 中的函数内部创建循环?
- c# - 如何在反序列化大 JSON 文件时显示带有不确定进度环的消息框?
- sql - 使用 union all 的结果集创建新列 - sql
- git - 如何从已经结帐的拉取请求中提取更改?
- javascript - 如何使用 JS 传播剩余破坏删除嵌套属性?