2014-12-03 33 views
0

我創建了一個字母表的字典,其值從0開始,並且根據字文件增加了一定數量。我硬編碼最初的字典,我希望它保持字母順序,但它根本沒有。我希望它按字母順序返回字典,基本保持與最初的字典相同。我怎樣才能保持它的秩序?字典不停留在訂單python

from wordData import* 

def letterFreq(words): 

    totalLetters = 0 
    letterDict = {'a':0,'b':0,'c':0,'d':0,'e':0,'f':0,'g':0,'h':0,'i':0,'j':0,'k':0,'l':0,'m':0,'n':0,'o':0,'p':0,'q':0, 
        'r':0,'s':0,'t':0,'u':0,'v':0,'w':0,'x':0,'y':0,'z':0} 

    for word in words: 
     totalLetters += totalOccurences(word,words)*len(word) 
     for char in range(0,len(word)): 
      for letter in letterDict: 
       if letter == word[char]: 
        for year in words[word]: 
         letterDict[letter] += year.count 
    for letters in letterDict: 
     letterDict[letters] = float(letterDict[letters]/totalLetters) 
    print(letterDict) 
    return letterDict 

def main(): 

    filename = input("Enter filename: ") 
    words = readWordFile(filename) 
    letterFreq(words) 


if __name__ == '__main__': 
    main() 
+0

我發現'年]的單詞[字]:letterDict [letter] + = year.count'非常混亂。你能詳細說說那裏發生了什麼?另外,float(letterDict [letters]/totalLetters)'可能不會做你認爲它做的事。 – jpmc26 2014-12-03 01:52:52

+1

可能重複的[Python字典,保持與聲明相同的順序鍵/值](http://stackoverflow.com/questions/1867861/python-dictionary-keep-keys-values-in-same-order-as-declared ) – Zulu 2014-12-03 02:04:52

回答

7

字典沒有訂購,也沒有爲您保留任何訂單。

你可以使用一個有序字典:

from collections import OrderedDict 
letterDict = OrderedDict([('a', 0), ('b', 0), ('c', 0)]) 

或者你可以回到你的詞典內容

letterDict = {'a':0,'b':0,'c':0} 
sortedList = sorted([(k, v) for k, v in letterDict.iteritems()]) 

print sortedList # [('a', 0), ('b', 0), ('c', 0)] 
+3

值得注意的是:'OrderedDict'不是* sorted *字典。它的順序是插入順序,iirc。 – jpmc26 2014-12-03 01:45:07

+0

有什麼方法可以返回一個列表或另一個字典,將按字母順序? – Cos 2014-12-03 01:49:20

+1

我會投票,但你有正確的1000代表,這很酷 – 2014-12-03 02:04:52

1

排序列表您可以按照您的詞典的按鍵和迭代的字典。

>>> for key in sorted(letterDict.keys()): 
...  print ('{}: {}').format(key, letterDict.get(key)) 
... 
a: 0 
b: 0 
c: 0 
d: 0 
e: 0 
... 

OR

這可能是你的情況可能的解決方案。我們可以將您所有的dictionary's keys列表中的序列不更改,然後我們可以從您的字典中按順序獲取值。

>>> import string 
>>> keys = list(string.ascii_lowercase) 
>>> letterDict = {'a':0,'b':0,'c':0,'d':0,'e':0,'f':0,'g':0,'h':0,'i':0,'j':0,'k':0,'l':0,'m':0,'n':0,'o':0,'p':0,'q':0, 
...     'r':0,'s':0,'t':0,'u':0,'v':0,'w':0,'x':0,'y':0,'z':0} 
>>> for key in keys: 
...  if key in letterDict: 
...   print ('{}: {}').format(key, letterDict.get(key)) 
... 
a: 0 
b: 0 
c: 0 
d: 0 
e: 0 
f: 0 
g: 0 
h: 0 
i: 0 
j: 0 
k: 0 
l: 0 
m: 0 
.... 
+0

這實際上是一個很好的解決方案,儘管有點天真(只有當你已經知道鑰匙先驗)。但是可以通過檢查字典鍵並在訪問它們之前對它們進行排序來擴展它。即使如此,它仍然遠非理想,因爲事先您通過實例化鍵列表來佔用內存。 – 2014-12-03 02:10:17

+0

@PabloMescher我只是想爲他的案例展示一個可能的解決方案,因爲我們在網絡上有很多可用的解決方案(Orderdict,運營商等)。但我同意,這是不是有效的內存情況下,如果字典得到更新。 – 2014-12-03 02:16:39

0

我不會那樣實現它。這很難閱讀。更多的東西是這樣的:

# Make sure that division always gives you a float 
from __future__ import division 
from collections import defaultdict, OrderedDict 
from string import ascii_lowercase 

... 

    letterDict = defaultdict(int) 

    ... 

     # Replace the for char in range(0,len(word)): loop with this 
     # Shorter, easier to understand, should be equivalent 
     for year in words[word]: 
      for char in word: 
       letterDict[char] += year.count 

    ... 

    # Filter out any non-letters at this point 
    # Note that this is the OrderedDict constructor given a generator that creates tuples 
    # Already in order since ascii_lowercase is 
    letterRatio = OrderedDict((letter, letterDict[letter]/totalLetters) for letter in ascii_lowercase) 
    print(letterRatio) 
    return letterRatio 

... 

現在你返回一個OrderedDict,訂單將被保留。不過,我確實很警惕。如果你真的需要,那麼我需要按照正確的順序對它進行排序。不要依賴計算新數據的函數來按特定排序順序返回事物。當你需要排序時將其排序,而不是之前。

2

你只需要鑰匙才能一次,所以:

# create letterDict as in your question  
keys = list(letterDict) 
keys.sort() 
for key in keys: 
    # do whatever with letterDict[key] 

如果你需要他們爲了不止一次,你可以使用標準庫的collections.OrderedDict。有時候這就是你所需要的。它通過添加順序保留字典鍵順序。

如果你真的需要一個有序的密鑰字典類型,你不需要它只是一次(其中list_.sort()是更好的),你可以嘗試以下操作之一: http://stromberg.dnsalias.org/~dstromberg/datastructures/

關於上述鏈接,如果您的密鑰按照已排序的順序添加,您可能最好使用樹木或紅黑樹(平均而言,樹木越多越好,但紅黑樹的樹木較低標準偏差)。如果您的密鑰(總是)以隨機順序添加,那麼簡單的二叉樹就更好了。

BTW,當前的時尚似乎有利於排序(list_)在list_.sort(),但排序(list_)是一個相對較新的除了我們沒有加入之前相處得很好的語言,這是一個有點比較慢。而且,list_.sort()不會像sort(list_)那樣引起單線程濫用。

哦,和香草字典是無序的 - 這就是爲什麼他們快速訪問任意元素(它們建立在散列表上)。上面給出的datastructures URL的一些類型在dict_.find_min()和dict_.find_max()方面很好,並且不需要keys.sort(),但是在訪問任意元素時它們較慢(logn)。