2017-02-14 65 views
0

出于效率的原因,我将一个文本巨大的字典表示为一个Python字典,其中包含一个元组形式的密钥(first letter, number of letter)。我们可以把它想象成一个矩阵。让我们从列表中建立了一个例子:如何通过密钥的子集访问字典的子集?

l=["baby", "bird","as","at", "friend","always"] 
d = {} 
for mot in l: 
    if (len(mot), mot[0]) in d: 
     d[len(mot),mot[0]].append(mot) 
    else: 
     d[len(mot),mot[0]] = [mot] 

print("d : ", d) 

结果是:

d : {(6, 'a'): ['always'], (6, 'f'): ['friend'], (2, 'a'): ['as', 'at'], (4, 'b'): ['baby', 'bird']} 

的问题是如何打印在单指令/访问线或行。 例如:所有的话开始用,或长度为6

+0

*真实*问题是,你能证明*任何*努力解决这个问题吗? –

+2

简短的回答是:你不能。这不是字典的工作方式。您可能必须搜索所有密钥,检查它们包含的内容并连接结果。 – jonrsharpe

+1

我想知道是否有更好的集合可以使用,而不是以元组作为关键字的字典。 –

回答

2

使用过滤器内置,它需要两个参数,函数和迭代的所有单词:

filter(lambda x, y: x[0] == 6, d.items()) 
2

用一个命令,一个选择可能是:

lines = [d[k] for k in d if k[1] == 'a'] 

对于其他情况也是如此。

但是,这完全超过了使用字典的重要性,现在您只是扫描了所有的键以找到部分共享密钥的元素。

将每个长度与一个字母字典关联起来并进行双键查找将会更有效,更具时效性;这显然会增加结构的内存需求,但这是您需要付出的折衷。

+0

是的,你的解决方案是好的,但我不同意这个评论:扫描所有的键对于字典来说不是太昂贵(通过26个字母或1到15个长度)。在这种情况下,查找单词或纠正单词拼写可能很有效。你怎么看这个评论? – Hana

+0

@Hana:假设您有长度介于1到15个字母之间的所有26个字母的条目。然后,你将拥有'(1,'a')'到'(15,'z')',这就是你需要每循环一次的390个键。有一种方法可以更快地查找自己字典/集合中的长度/字母......我想。 –

+0

390个键对于超过10万个单词的词典来说不算太多。您可以给我更多有关双键查找原理的详细信息; – Hana