Лучший способ переупорядочить список словарей? - PullRequest
0 голосов
/ 10 ноября 2018

Итак, у меня есть такие маленькие данные:

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

Я хочу найти график так, чтобы ось x была: "Bl", "Bz", "Zl" (алфавитный порядок)
и ось у: «Корея», «Китай», «Араб» (соответствует кодовым именам).

Я думал о:

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 голосов
/ 10 ноября 2018

Лучший способ получить те же результаты:

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']
0 голосов
/ 10 ноября 2018

Вот один из способов использования 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')
0 голосов
/ 10 ноября 2018

Итак, вот данные:

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'}]

Надеюсь, я смогу вам помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...