如何根据内部字典的值来订购字典字典

时间:2014-10-30 22:44:59

标签: python sorting python-3.x dictionary

我在Python中有一个字典,其字典值如下:

{'q1': {'d1': 1.2 , 'd5': 5.2}, 
 'q2': {'d4': 3.23, 'd7': 3.9 , 'd8': 4.1},
 'q3': {'d3': 0.5}}

我想对此字典进行排名,并根据浮点数的减少值显示d个变量 与它们相关的价值。

结果应该是这样的:

['d5', 'd8', 'd7', 'd4', 'd1', 'd3']

这是我为填写字典而写的代码的一部分:

if q not in result.keys():
    result[q] = {id:rsv[id]}
elif id not in result[q]:
    result[q][id]=rsv[id]

我想显示按rsv值排序的id。 有没有办法做到这一点?或者是否有基于一系列值对字典进行排名的替代解决方案?

4 个答案:

答案 0 :(得分:1)

由于op改变了spec在内部dicts中有多个键值对,我想我会展示一个解决方案,该解决方案借鉴了@ jarno-lamberg的一些想法。这里的关键是,因为看起来外部映射是无关紧要的,我首先抓住所有的dicts并将它们展平成一个元组列表。

d =  {'q1': {'d1': 1.2 , 'd5': 5.2}, 
      'q2': {'d4': 3.23, 'd7': 3.9 , 'd8': 4.1},
      'q3': {'d3': 0.5}}
d_flattened = [(k,v) for temp_d in d.values() for k,v in temp_d.items()]
d_sorted = sorted(d_flattened, key=lambda i: i[1], reverse=True)
print(', '.join(k for k,v in d_sorted))

答案 1 :(得分:0)

对值进行排序,提取为值和键的元组(按此顺序),然​​后提取密钥:

[key for value, key in sorted(
    (item[::-1] for d in outer.values() for item in d.items()), 
    reverse=True)]

(item[::-1] for d in outer.values() for item in d.items())表达式从每个嵌套字典值中提取(key, value)对,反转键和值以便于排序。

然后排序取第一个值,反之,之后外部列表理解再次提取键。

演示:

>>> d = {'q1': {'d1': 1.2 , 'd5':5.2}, 'q2': {'d4': 3.23, 'd7':3.9 , 'd8':4.1}, 'q3': {'d3': 0.5}}
>>> outer = {'q1': {'d1': 1.2 , 'd5':5.2}, 'q2': {'d4': 3.23, 'd7':3.9 , 'd8':4.1}, 'q3': {'d3': 0.5}}
>>> sorted((item[::-1] for d in outer.values() for item in d.items()), reverse=True)
[(5.2, 'd5'), (4.1, 'd8'), (3.9, 'd7'), (3.23, 'd4'), (1.2, 'd1'), (0.5, 'd3')]
>>> [key for value, key in sorted(
...     (item[::-1] for d in outer.values() for item in d.items()), 
...     reverse=True)]
['d5', 'd8', 'd7', 'd4', 'd1', 'd3']

答案 2 :(得分:0)

我会分两步来解决这个问题:排序,然后显示。要进行排序,请使用键功能:

d_sorted = sorted(d.items(), reverse=True, key=lambda x: list(x[1].values())[0])

然后,显示数据:

print(', '.join(list(x[1].keys())[0] for x in d_sorted))

一般来说,这是一个好主意,因为您可能希望完全重用已排序的数据。

答案 3 :(得分:0)

我的目标是代码清晰度,并认为在这种情况下最好用更多的行来实现。请注意,使用的缩进是为了更好地显示结构。

根据我的经验,这个答案包含经常需要的中间结果。它将它们保留为字典,直到只需要键的结尾。

首先,Python 2.x版本只是因为:

d = {'q1': {'d1': 1.2 , 'd5': 5.2},
     'q2': {'d4': 3.23, 'd7': 3.9 , 'd8': 4.1},
     'q3': {'d3': 0.5}}

# First, flatten to a list of one key-value pair dictionaries
inner_dicts = [
    dict([(k,v)]) 
    for inner_d in d.values() 
        for (k, v) in inner_d.items()]

# Second, sort that list based on the value in each dict
dictlist_sorted = sorted(
    inner_dicts, 
    key=lambda temp_d: temp_d.values()[0], 
    reverse=True)

# Third, extract the key of each dict
keys_sorted = [temp_d.keys()[0] for temp_d in dictlist_sorted]

print keys_sorted

其次,Python 3版本:

d = {'q1': {'d1': 1.2 , 'd5': 5.2},
     'q2': {'d4': 3.23, 'd7': 3.9 , 'd8': 4.1},
     'q3': {'d3': 0.5}}

# First, flatten to a list of one key-value pair dictionaries
inner_dicts = [
    dict([(k,v)]) 
    for inner_d in d.values() 
        for (k, v) in inner_d.items()]

# Second, sort that list based on the value in each dict
dictlist_sorted = sorted(
    inner_dicts, 
    key=lambda temp_d: list(temp_d.values())[0], 
    reverse=True)

# Third, extract the key of each dict
keys_sorted = [list(temp_d.keys())[0] for temp_d in dictlist_sorted]

print(keys_sorted)