2017-02-14 91 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