2012-04-10 216 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]]