簡體   English   中英

在python中按值對defaultdict進行排序

[英]Sorting a defaultdict by value in python

我有一個數據結構是這樣的:

三個城市不同年份的人口如下。

Name  1990 2000 2010
A     10   20   30
B     20   30   10
C     30   10   20

我正在使用defaultdict來存儲數據。

from collections import defaultdict
cityPopulation=defaultdict(list)
cityPopulation['A']=[10,20,30]
cityPopulation['B']=[20,30,10]
cityPopulation['C']=[30,10,20]

我想根據列表的特定列(年份)對defaultdict進行排序。 比如說,1990 年的排序應該給出C,B,A ,而 2010 年的排序應該給出A,C,B

另外,這是存儲數據的最佳方式嗎? 當我改變人口值時,我希望它是可變的。

>>> sorted(cityPopulation.iteritems(),key=lambda (k,v): v[0],reverse=True) #1990
[('C', [30, 10, 20]), ('B', [20, 30, 10]), ('A', [10, 20, 30])]
>>> sorted(cityPopulation.iteritems(),key=lambda (k,v): v[2],reverse=True) #2010
[('A', [10, 20, 30]), ('C', [30, 10, 20]), ('B', [20, 30, 10])]

注意在 python 3 中你不能自動解包 lambda 參數,所以你必須更改代碼

sorted(cityPopulation.items(), key=lambda k_v: k_v[1][2], reverse=True) #2010

如果您想根據值而不是鍵進行排序,請使用data.items()並使用lambda kv: kv[1]設置鍵,以便它選擇值。


請參閱此defaultdict的示例:

>>> from collections import defaultdict
>>> data = defaultdict(int)
>>> data['ciao'] = 17
>>> data['bye'] = 14
>>> data['hello'] = 23

>>> data
defaultdict(<type 'int'>, {'ciao': 17, 'bye': 14, 'hello': 23})

現在,讓我們按值排序:

>>> sorted(data.items(), lambda kv: kv[1])
[('bye', 14), ('ciao', 17), ('hello', 23)]

如果您希望較大的數字先出現,最后使用reverse=True

>>> sorted(data.items(), lambda kv: kv[1], reverse=True)
[('hello', 23), ('ciao', 17), ('bye', 14)]

請注意, key=lambda(k,v): v是一種更清晰的(對我來說)說key=lambda(v): v[1] ,只是后者是 Python 3 允許它的唯一方式,因為auto tuple無法在 lambda 中解包

在 Python 2 中,你可以說:

>>> sorted(d.items(), key=lambda(k,v): v)
[('bye', 14), ('ciao', 17), ('hello', 23)]

defaultdict沒有順序。 您可能需要使用OrderedDict ,或者每次將鍵作為列表進行排序。

例如:

  from operator import itemgetter
  sorted_city_pop = OrderedDict(sorted(cityPopulation.items()))

編輯:如果您只想打印訂單,只需使用sorted內置:

for key, value in sorted(cityPopulation.items()):
    print(key, value)

遲到的答案,而不是對問題的直接回答,但如果你最終從“在 python 中按值排序 defaultdict ”谷歌搜索,這就是我的排序方式(普通的 python 詞典無法排序,但它們可以是打印排序)一個defaultdict按其值:

orders = {
    'cappuccino': 54,
    'latte': 56,
    'espresso': 72,
    'americano': 48,
    'cortado': 41
}

sort_orders = sorted(orders.items(), key=lambda x: x[1], reverse=True)

for i in sort_orders:
    print(i[0], i[1])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM