2016-03-09 50 views
0

我有以下字典,age_freq:Python - 从字典中获取有序键/值对的最简单方法?

age_freq = {'Age35-44': 194, 'Age0-14': 11, 'Age55-64': 51, 'Age45-54': 142, 'Age65-74': 12, 'Age15-24': 223, 'Age25-34': 310} 

我想从这个字典返回键/值对创建一个饼图的目的。我的代码做,这是下面:

age_range=[] 
freq=[] 

for key, value in age_freq.iteritems(): 
    aKey = key 
    aValue = value 
    age_range.append(aKey) 
    freq.append(aValue) 

这工作得很好,我也得到了以下两个列表:

age_range = ['Age35-44', 'Age0-14', 'Age65-74', 'Age45-54', 'Age55-64', 'Age15-24', 'Age25-34'] 

freq = [194, 11, 12, 142, 51, 223, 310] 

不过,我需要的名单,以增加年龄范围进行排序。什么是最简单的方法来做到这一点?

回答

2

只要对它进行排序即可。

age_range, freq = zip(*sorted(age_freq.items())) 

如果年龄范围不太整齐,在评论中提到,你可以明确地提取他们,(例如)打开每个范围的低端和高端到一个整数,然后发现他们平均:

age_range, freq = zip(*sorted(age_freq.items(), key=lambda x: (int(x[3].split('-')[0]) + int(x[3].split('-')[1])/2)) 
+0

您将'age_range'和'freq'组合成'age_freq'。这是允许的吗? –

+0

我不明白你在问什么。你的意思是拆包的理由吗? – TigerhawkT3

+0

这只发生在工作,因为年龄范围都使用两位数字。现在,在那里添加'Age5-15'。您可能希望更加小心,并提取两个年龄段中的第一个并将其转换为整数。 –

-1

Python的字典是没有顺序的,所以iteritems()将在相同的“秩序”返回键和值前

要建立有序的键/值列表,你可以做这样的事情:

for key in sorted(age_freq.keys()): 
    aKey = key 
    aValue = age_freq.pop(key) 

    age_range.append(aKey) 
    freq.append(aValue) 

由于这会在最后一个一个弹出键,所以您将剩下一个空字典,但是如果您只是创建饼图,则无关紧要。

+2

排序字典时绝对不需要调用keys()。 'sorted(age_freq)'给出相同的输出而不创建中间列表。 –

+0

另外,为什么通过弹出值来销毁原始字典? –

1

我相信最Python的方式做到这一点是:

sortedFreq = [(key, age_freq[key]) for key in sorted(age_freq)] 
+2

排序字典时绝对不需要调用'keys()'。 'sorted(age_freq)'给出相同的输出而不创建中间列表。 –

+0

你正确的'keys()'是不需要的。但是 - 在Python 3中 - 它不创建中间列表;这是一个发电机。 –

+0

它仍然会创建一个不需要的中介对象。它不是'dict.keys()'返回的生成器,它是一个字典视图(一个类似于对象的对象)。 –

0

我不知道这是很整洁,高效的,但我觉得有时候可读性/重用计数,所以我建议将其转换为一个字典列表:

age_freq = {'Age35-44': 194, 'Age0-14': 11, 'Age55-64': 51, 'Age45-54': 142, 'Age65-74': 12, 'Age15-24': 223, 'Age25-34': 310} 

table = [{'start': int(key.split('Age')[1].split('-')[0]), 
      'stop': int(key.split('Age')[1].split('-')[1]), 
      'freq': age_freq[key]} 
     for key in age_freq] 

,现在你可以做任何你用它想:按启动年龄

import operator 
sorted(table, key=operator.itemgetter('start')) 

排序停年龄

sorted(table, key=operator.itemgetter('start')) 

按频率排序

sorted(table, key=operator.itemgetter('freq')) 

但这可能不是“最简单”的方式。

相关问题