我在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。 有没有办法做到这一点?或者是否有基于一系列值对字典进行排名的替代解决方案?
答案 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)