[英]Trouble understanding how to use lambda to sort dict
我正在嘗試對這本字典進行排序。
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排序並輸出名稱wrt排序值。 在此,TPS [0]對應於TesTName [0]。 我想對TPS排序時對Testname排序。 預期產量:
d = {'TestName': ['Test1208','Test1206','Test1205','Test1207'],
'TPS':['34.00', '45.00', '78.00', '73400']
這是我到目前為止所擁有的: sorted(d['TPS'],key=lambda d:d)
在對TPS
排序時,如何確保Testname
也可以互換?
這是一個功能解決方案。 訣竅是使用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')}
假設您希望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
列表已經排序。
除了@jpp的解決方案之外,如果您想要新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
我將創建一個Record
namedtuple來保存每個單獨的記錄,然后輕松進行排序,並在需要時強制返回到列表的字典。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.