2012-02-09 39 views
1

我想獲得的所有值(除了對應於特定密鑰)通過這樣做,從類型的字典列表:訂購值時提取的Python字典列出

fv = [[v for (k,v) in d.iteritems() if k is not 'xKey'] for d in someDict] 

其中someDict是這樣的:

[{xKey:0.1,yKey:0.2,zKey:0.3},{yKey:0.9,xKey:0.7,zKey:0.4}...] 

我知道一個字典沒有固有的順序。但是我的列表fv需要按順序具有值。我正在考慮對關鍵字進行排序,然後按照我剛纔的做法。但是,這是保證工作?

我知道使用OrderedDict是一個選項,但它似乎與dict相比性能較差,這對我來說是一個問題,因爲我的字典通常會有大量的數據。

更新:當我說我需要按順序排列的值時,他們並不需要排序。我的意思是我需要能夠每次以固定的確定性順序檢索值列表。在上面的例子中,我總是想得到[[0.2,0.3],[0.9,0.4]],儘管它本身可能不是一個排序順序。排序會強制執行一個確定性的順序。我真正關心的是如何保持最終列表中的值的位置。 yKey的值必須始終是每個列表中的第一個值,zKey的值必須始終是每個列表中的第二個值,依此類推,即使ykey,zkey等可能在字典中以任意順序排列。

+2

我會使用'OrderedDict',然後測量速度並查看性能是否有問題。在感興趣的領域沒有重要經驗的情況下預測績效往往非常困難。 – 2012-02-09 21:44:04

+0

我同意,儘管字典會隨着時間的推移而逐漸變大,而且我明白我們也許不應該修復它,如果它沒有被破壞,但我不想在一週內重新訪問它。 – atlantis 2012-02-09 21:50:08

+0

「一個固定的確定性順序......它本身可能不是一個排序順序」你不能有一個不確定但確定性的順序。這只是要求下一個版本具有與確定性順序不同的未指定問題。請做一個有限的,明確的,有效的陳述。一個希望的功能不會奏效。 – 2012-02-09 22:44:43

回答

2

如果你知道你的類型的字典可以包含以下解決方案可能會爲你工作可能的密鑰列表:

allkeys = ... # might be known; or obtained from available dicts by union; 
       # 'xKey' can be removed at this stage to simplify the list 
       # comprehension that follows 
sortedKeys = sorted(allKeys) 
list_of_values = [[d.get(k) for k in sortedKeys if k in d] 
                for d in list_of_dicts] 

它可能會比iteritems慢,但。如果所有的字典都包含相同的一組密鑰,則可以刪除if k in d部分。

1

通常的演習是這樣的。

  1. 建立你的字典作爲字典。速度非常好。

  2. 在極少數情況下,當你需要的順序按鍵做兩者之一:

    • 轉換整個事情到OrderedDict

    • 排序的關鍵。 for k in sorted(some_dict.keys()):

    選擇的是分類成本的攤銷之一。如果你正在做一件事,就排序。如果你正在做幾件事,建立一個OrderedDict。

  3. 在確實非常罕見的情況下,值必須以某種順序排列,請執行此操作。

    ordered_values = list(sorted(some_dictionary.values())) 
    
+0

它只是我,還是他要求排序_values_? – voithos 2012-02-09 21:38:13

+1

「的順序。我真正關心的是將價值觀的位置保留在最終名單中。」所以。目前尚不清楚密鑰**是否必須被排序以保證確定性順序,或者必須對**值進行排序以保證確定性順序。我投票給了鑰匙,因爲它更簡單。這個問題當然不清楚。 – 2012-02-09 22:42:28

+0

你的第3部分似乎不適合我?這是我需要的情況。 – 2013-09-24 18:32:55