我有一个像这样构建的大字典:
programs['New York'] = 'some values...'
programs['Port Authority of New York'] = 'some values...'
programs['New York City'] = 'some values...'
...
如何返回programs
的所有元素,其中的键提到“new york”(不区分大小写)?在上面的例子中,我想要获得所有这三个项目。
编辑:字典很大,预计会随着时间的推移而变大。
答案 0 :(得分:60)
[value for key, value in programs.items() if 'new york' in key.lower()]
答案 1 :(得分:8)
这通常称为宽松字典,可以使用后缀树有效实现。
此方法使用的内存在键上是线性的,这是最佳的,搜索时间在您搜索的子字符串长度上是线性的,这也是最佳的。
我在python中找到了这个实现它的库。
答案 2 :(得分:5)
你应该使用mensi给出的蛮力方法,直到证明它太慢。
这是复制数据以提供更快速查找的内容。它只适用于你的搜索仅用于整个单词 - 即你永远不需要匹配“纽约最佳百吉饼”,因为“york”和“yorks”是不同的单词。
words = {}
for key in programs.keys():
for w in key.split():
w = w.lower()
if w not in words:
words[w] = set()
words[w].add(key)
def lookup(search_string, words, programs):
result_keys = None
for w in search_string.split():
w = w.lower()
if w not in words:
return []
result_keys = words[w] if result_keys is None else result_keys.intersection(words[w])
return [programs[k] for k in result_keys]
如果单词必须按顺序排列(即“York New”不匹配),您可以将强力方法应用于result_keys
的短名单。
答案 3 :(得分:3)
iteritems
和生成器表达式将执行此操作:
d={'New York':'some values',
'Port Authority of New York':'some more values',
'New York City':'lots more values'}
print list(v for k,v in d.iteritems() if 'new york' in k.lower())
输出:
['lots more values', 'some more values', 'some values']
答案 4 :(得分:2)
您可以提前生成所有子字符串,并将它们映射到各自的键。
#generates all substrings of s.
def genSubstrings(s):
#yield all substrings that contain the first character of the string
for i in range(1, len(s)+1):
yield s[:i]
#yield all substrings that don't contain the first character
if len(s) > 1:
for j in genSubstrings(s[1:]):
yield j
keys = ["New York", "Port Authority of New York", "New York City"]
substrings = {}
for key in keys:
for substring in genSubstrings(key):
if substring not in substrings:
substrings[substring] = []
substrings[substring].append(key)
然后,您可以查询substrings
以获取包含该子字符串的键:
>>>substrings["New York"]
['New York', 'Port Authority of New York', 'New York City']
>>> substrings["of New York"]
['Port Authority of New York']
优点:
缺点:
substrings
会在您的计划开始时产生一次性费用,花费的时间与programs
中的密钥数量成正比。substrings
将与programs
中的键数近似线性增长,从而增加了脚本的内存使用量。genSubstrings
相对于密钥的大小具有O(n ^ 2)性能。例如,“纽约港务局”生成351个子串。