python按相同键值计数排序字典列表



我有字典列表,关键'city'可能是重复的。我需要将这个列表从重复次数最多的城市到重复次数最少的城市进行排序。

我的字典列表:

data = [
{'city': 'Zp', 'p': 8},
{'city': 'Kyiv', 'p': 2},
{'city': 'Lviv', 'p': 7},
{'city': 'Kyiv', 'p': 3},
{'city': 'Kyiv', 'p': 4},
{'city': 'Brd', 'p': 1},
{'city': 'Kyiv', 'p': 5},
{'city': 'Zp', 'p': 9},
{'city': 'Lviv', 'p': 6},
]

我尝试按键值计数排序,但得到相同的结果:

data = sorted(data, key=lambda x: data.count(x['city']))
# >> data
#     [
#       {'city': 'Zp', 'p': 8},
#       {'city': 'Kyiv', 'p': 2},
#       {'city': 'Lviv', 'p': 7},
#       {'city': 'Kyiv', 'p': 3},
#       {'city': 'Kyiv', 'p': 4},
#       {'city': 'Brd', 'p': 1},
#       {'city': 'Kyiv', 'p': 5},
#       {'city': 'Zp', 'p': 9},
#       {'city': 'Lviv', 'p': 6},
#     ]

这将给我几乎需要的结果,但是有2个对象与'Lviv'和2个与'Zp',他们在结果中混合(我也认为这种方法需要太多的资源)

data = sorted(
data,
key=lambda x: len(
[i for i in data if i['city'] == x['city']]
),
reverse=True
)
# >> data
#  [
#    {'city': 'Kyiv', 'p': 2},
#    {'city': 'Kyiv', 'p': 3},
#    {'city': 'Kyiv', 'p': 4},
#    {'city': 'Kyiv', 'p': 5},
#    {'city': 'Zp', 'p': 8},
#    {'city': 'Lviv', 'p': 7},
#    {'city': 'Zp', 'p': 9},
#    {'city': 'Lviv', 'p': 6},
#    {'city': 'Brd', 'p': 1},
#]

我想要得到的:

# >> data
#    [
#        {'city': 'Kyiv', 'p': 2},
#        {'city': 'Kyiv', 'p': 3},
#        {'city': 'Kyiv', 'p': 4},
#        {'city': 'Kyiv', 'p': 5},
#        {'city': 'Lviv', 'p': 6},
#        {'city': 'Lviv', 'p': 7},
#        {'city': 'Zp', 'p': 8},
#        {'city': 'Zp', 'p': 9},
#        {'city': 'Brd', 'p': 1},
#    ]
from collections import Counter
from pprint import pprint
data = [
{'city': 'Zp', 'p': 8},
{'city': 'Kyiv', 'p': 2},
{'city': 'Lviv', 'p': 7},
{'city': 'Kyiv', 'p': 3},
{'city': 'Kyiv', 'p': 4},
{'city': 'Brd', 'p': 1},
{'city': 'Kyiv', 'p': 5},
{'city': 'Zp', 'p': 9},
{'city': 'Lviv', 'p': 6},
]
# find the number of occurrences of each city
cities = map(lambda d: d['city'], data)
c = Counter(cities)
# sort data according to 1) frequency of the city, 2) name of the city
sorted_data = sorted(data, key=lambda d: (c[d['city']], d['city']), reverse=True)
pprint(sorted_data)

这里需要按两个键排序:

  1. data中城市记录出现的次数(您只需要为此提取城市名称列表)
  2. 打破平局的城市名称
>>> sorted(
data, 
key=lambda x: (list(y['city'] for y in data).count(x['city']), x['city']), 
reverse=True
)
[
{'city': 'Kyiv', 'p': 2}, 
{'city': 'Kyiv', 'p': 3}, 
{'city': 'Kyiv', 'p': 4}, 
{'city': 'Kyiv', 'p': 5}, 
{'city': 'Zp', 'p': 8}, 
{'city': 'Zp', 'p': 9}, 
{'city': 'Lviv', 'p': 6}, 
{'city': 'Lviv', 'p': 7}, 
{'city': 'Brd', 'p': 1}
]

最新更新