Проблемы с пониманием, как использовать лямбду для сортировки диктов - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь отсортировать этот словарь.

d = {'FNP': ['0.02', '0.02', '0.02', '0.02'],
     'TestName': ['Test1205', 'Test1206', 'Test1207', 'Test1208'],
     'eno': ['0', '0', '0', '0'],
     'GRE': ['0.00', '0.00', '0.00', '0.00'],
     'TPS': ['78.00', '45.00', '73400', '34.00'],
     'id': ['1', '1', '1', '1']}

Я пытаюсь отсортировать по TPS и вывести имя по отсортированным значениям.Здесь TPS [0] соответствует TesTName [0].Я хочу отсортировать Testname при сортировке TPS.Ожидаемый результат:

d = {'TestName': ['Test1208','Test1206','Test1205','Test1207'],
     'TPS':['34.00', '45.00', '78.00', '73400']

Это то, что я имею до сих пор: sorted(d['TPS'],key=lambda d:d)

Как мне обеспечить, чтобы Testname s также менялись местами при сортировке TPS?

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Я бы сделал именованный кортеж Record для хранения каждой отдельной записи, затем легко сортировал бы и приводил к списку, если вам это нужно.

from collections import namedtuple

Record = namedtuple("Record", "FNP TestName eno GRE TPS id")

def extract(d, keys=None):
    if keys is None:
        keys = ["FNP", "TestName", "eno", "GRE", "TPS", "id"]
    records = [Record(*vals) for vals in zip(*map(d.get, keys))]
    return records

def transform(records):
    records.sort(key=lambda r: float(r.TPS))

def load(records, keys=None):
    if keys is None:
        keys = ["FNP", "TestName", "eno", "GRE", "TPS", "id"]
    d = {k: [getattr(record, k) for record in records] for k in keys}
    return d

d = {'FNP': ['0.02', '0.02', '0.02', '0.02'],
     'TestName': ['Test1205', 'Test1206', 'Test1207', 'Test1208'],
     'eno': ['0', '0', '0', '0'],
     'GRE': ['0.00', '0.00', '0.00', '0.00'],
     'TPS': ['78.00', '45.00', '73400', '34.00'],
     'id': ['1', '1', '1', '1']}
records = extract(d)
transform(records)
new_d = load(records)
0 голосов
/ 23 октября 2018

Предполагая, что вы хотите отсортировать список TPS численно , а не лексически (в алфавитном порядке по значению каждого элемента строки в нем):

from pprint import pprint

d = {'FNP': ['0.02', '0.02', '0.02', '0.02'],
     'TestName': ['Test1205', 'Test1206', 'Test1207', 'Test1208'],
     'eno': ['0', '0', '0', '0'],
     'GRE': ['0.00', '0.00', '0.00', '0.00'],
     'TPS': ['78.00', '45.00', '73400', '34.00'],
     'id': ['1', '1', '1', '1']}

d['TestName'] = sorted(d['TestName'])
d['TPS'] = sorted(d['TPS'], key=float)

pprint(d)

Вывод:

{'FNP': ['0.02', '0.02', '0.02', '0.02'],
 'GRE': ['0.00', '0.00', '0.00', '0.00'],
 'TPS': ['34.00', '45.00', '78.00', '73400'],
 'TestName': ['Test1205', 'Test1206', 'Test1207', 'Test1208'],
 'eno': ['0', '0', '0', '0'],
 'id': ['1', '1', '1', '1']}

Обратите внимание, что список TestName уже отсортирован.

0 голосов
/ 23 октября 2018

В дополнение к решению @ jpp, если вы хотите отсортированную версию всех списков в исходном dict в вашем новом dict, вы можете сжать каждый список данных с помощью исходного TPS, отсортировать кортежи и создать свой новый список данных изотсортированные данные:

original_tps = [float(t) for t in d['TPS']]
sorted_d = {}

for k, v in d.items():
    sorted_d[k] = [x for tps, x in sorted([(t, e) for t, e in zip(original_tps, v)])]


print(sorted_d['TPS'])
# ['34.00', '45.00', '78.00', '73400']                                                                                                    
print(sorted_d['TestName'])
# ['Test1208', 'Test1206', 'Test1205', 'Test1207']
# ... similarly other lists are sorted
0 голосов
/ 23 октября 2018

Вот функциональное решение.Хитрость заключается в том, чтобы использовать enumerate для извлечения индексов, не забудьте преобразовать в float для сортировки и использовать itemgetter с несколькими аргументами для извлечения правильного порядка.

from operator import itemgetter

idx, _ = zip(*sorted(enumerate(d['TPS']), key=lambda x: float(x[1])))

res = {k: itemgetter(*idx)(d[k]) for k in ('TestName', 'TPS')}

{'TestName': ('Test1208', 'Test1206', 'Test1205', 'Test1207'),
 'TPS': ('34.00', '45.00', '78.00', '73400')}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...