2012-04-10 259 views
0

所以我有這個詞典:(Python)將字典轉換爲列表?

ScoreDict = {"Blue": {'R1': 89, 'R2': 80}, 
      "Brown": {'R1': 61, 'R2': 77}, 
      "Purple": {'R1': 60, 'R2': 98}, 
      "Green": {'R1': 74, 'R2': 91}, 
      "Red": {'R1': 87, 'Lon': 74}} 

有什麼辦法我怎麼可以轉換這本字典到像這樣的列表:

ScoreList = [['Blue', 89, 80], ['Brown', 61, 77], 
['Purple', 60, 98], ['Green', 74, 91], ['Red', 87, 74]] 

我不是太熟悉的字典,所以我真的這裏需要一些幫助。提前致謝!

+2

請問編號的順序有關係嗎? – agf 2012-04-10 05:25:19

回答

1

你可以試着這樣做:

ScoreList = [[key] + value.values() for key, value in ScoreDict.iteritems()] 

在它可能更有意義的循環形式:

ScoreList = [] 

for key, value in ScoreDict.iteritems(): 
    temp = [] 

    temp.append(key) 
    temp.extend(value.values()) 

    ScoreList.append(temp) 

將要面臨的主要問題是,字典不訂購。這些元素通過它們的散列進行索引,這意味着value.values()不會以任何特定順序返回字典的值。

+0

謝謝@Blender!這完美的作品!在這種情況下,秩序並不重要,所以這一切都很好! – DarsAE 2012-04-10 17:35:34

1

不可靠。沒有理由爲什麼這些密鑰會保持這種順序,因此不可能確保您可以從該字典中獲得該列表。

+0

我想說的是,鍵可以排序,但後來我看到,並非所有的嵌套字典鍵都是相同的。 – 2012-04-10 05:22:58

+0

OrderedDict from collections包可以用來獲取字典中鍵的初始化順序,是嗎? – fixxxer 2013-04-24 11:46:02

2

不保留數字的原始順序,因爲我沒有看到任何邏輯順序。

>>> ScoreDict = {"Blue": {'R1': 89, 'R2': 80}, 
      "Brown": {'R1': 61, 'R2': 77}, 
      "Purple": {'R1': 60, 'R2': 98}, 
      "Green": {'R1': 74, 'R2': 91}, 
      "Red": {'R1': 87, 'Lon': 74}} 
>>> [[k]+i.values() for k,i in ScoreDict.iteritems()] 
[['Blue', 89, 80], ['Brown', 61, 77], ['Green', 74, 91], ['Red', 74, 87], ['Purple', 60, 98]] 
+0

帶有'Red''的子列表不正確。 – 2012-04-10 05:25:17

+1

我發佈了一個類似但不太優雅的解決方案,我認爲重要的是要注意,如果您指望按特定順序列出第二項和第三項,則此**不起作用。 – 2012-04-10 05:25:19

+2

注意到:我在頂部說過。 – jamylak 2012-04-10 05:30:08

0

(這是非常脆弱!)

ScoreList = [[colour, rs["R1"], rs["R2" if "R2" in rs else "Lon"]] for colour, rs in ScoreDict.items()] 

此經過的每個鍵 - 值對ScoreDict,並從它創建的列表。這裏的重要功能是.items()documentation)。

(注意,在Python 2.x的.iteritems應該被用來代替.items避免構造中間列表。)

+0

'ScoreDict ['Red']'沒有「R2」條目。 – 2012-04-10 05:27:14

+0

@ IgnacioVazquez-Abrams啊,沒注意到!謝謝 :) – huon 2012-04-10 05:28:00

1

,如果你使用的是普通的字典一般來說,爲了將不會被保留。如果您想要保存訂單,最好使用Ordered Dict。

首先假設,你並不需要保存的順序做,那麼,你可以做這樣的事情,以獲得所需的輸出

>>> [([k]+v.values()) for k,v in ScoreDict.items()] 
[['Blue', 89, 80], ['Brown', 61, 77], ['Green', 74, 91], ['Red', 74, 87], ['Purple', 60, 98]] 
>>> 

但是,如果你是認真的順序,你原來的數據應該是組織爲OrderedDict。而且這裏有一個例子做

>>> ScoreDict 
OrderedDict([('Blue', OrderedDict([('R1', 89), ('R2', 80)])), ('Brown', OrderedDict([('R1', 61), ('R2', 77)])), ('Purple', OrderedDict([('R1', 60), ('R2', 98)])), ('Green', OrderedDict([('R1', 74), ('R2', 91)])), ('Red', OrderedDict([('R1', 87), ('R2', 74)]))]) 

,你可以很容易地看到,如何應用上述解決方案將產生相同的結果,但保留順序

>>> [([k]+v.values()) for k,v in ScoreDict.items()] 
[['Blue', 89, 80], ['Brown', 61, 77], ['Purple', 60, 98], ['Green', 74, 91], ['Red', 87, 74]]