重新排序字典列表的更好方法?

时间:2018-11-10 07:20:32

标签: python python-3.x list sorting dictionary

所以我有一个小数据,像这样:

data = [
    {"Name":"Arab","Code":"Zl"},
    {"Name":"Korea","Code":"Bl"},
    {"Name":"China","Code":"Bz"}
]

我想找到一个图形,使x轴为:“ Bl”,“ Bz”,“ Zl”(字母顺序)
y轴是:“韩国”,“中国”,“阿拉伯”(对应代号)。

我想到了:

new_data = {}
for dic in data:
    country_data = dic["Name"]
    code_data = dic["Code"]
    new_data[code_data] = country_data

code_data = []
for codes in new_data.keys():
    code_data.append(codes)
code_data.sort()

name_data = []
for code in code_data:
    name_data.append(new_data[code])

有更好的方法吗? 也许不创建新词典?

3 个答案:

答案 0 :(得分:1)

所以这是数据:

data = [
    {"Name":"Arab","Code":"Zl"},
    {"Name":"Korea","Code":"Bl"},
    {"Name":"China","Code":"Bz"}
]

要创建新的排序列表,请执行以下操作:

new_list = sorted(data, key=lambda k: k['Code'])

如果您不想获取新列表:

data[:] = sorted(data, key=lambda k: k['Code'])

结果是:

[{'Code': 'Bl', 'Name': 'Korea'}, {'Code': 'Bz', 'Name': 'China'}, {'Code': 'Zl', 'Name': 'Arab'}]

希望我能为您提供帮助!

答案 1 :(得分:0)

产生相同结果的更好方法:

from operator import itemgetter

data = [
    {"Name": "Arab",  "Code": "Zl"},
    {"Name": "Korea", "Code": "Bl"},
    {"Name": "China", "Code": "Bz"}
]

sorted_data = ((d["Code"], d["Name"]) for d in sorted(data, key=itemgetter("Code")))
code_data, name_data = (list(item) for item in zip(*sorted_data))

print(code_data)  # -> ['Bl', 'Bz', 'Zl']
print(name_data)  # -> ['Korea', 'China', 'Arab']

答案 2 :(得分:0)

这是使用operator.itemgetter并通过zip拆包的一种方法:

from operator import itemgetter

_, data_sorted = zip(*sorted(enumerate(data), key=lambda x: x[1]['Code']))

codes, names = zip(*map(itemgetter('Code', 'Name'), data_sorted))

print(codes)
# ('Bl', 'Bz', 'Zl')

print(names)
# ('Korea', 'China', 'Arab')