Python 难以理解如何使用lambda对dict进行排序

Python 难以理解如何使用lambda对dict进行排序,python,sorting,dictionary,lambda,Python,Sorting,Dictionary,Lambda,我正在整理这本词典 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'

我正在整理这本词典

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
列表按数字排序,而不是按词汇排序(按其中每个字符串元素的值按字母顺序排序):

输出:

{'FNP':['0.02','0.02','0.02','0.02','0.02'],
'GRE':['0.00','0.00','0.00','0.00'],
‘租置计划’:[‘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中获得原始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

我会制作一个名为tuple的
记录来保存每个单独的记录,然后轻松地进行排序,如果需要的话,强制返回到列表的dict

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)

那么您想对Testname和TPS的值进行排序吗?其他的钥匙怎么了?我猜73400是78点以后的。或者某个地方有输入错误。
d
不是一个
defaultdict(list)
,它只是一个普通字典,所以请澄清你的问题。你根本不需要lambda:
d['TPS']=排序(d['TPS'],key=lambda值:float(value))
。你可以这样写:
d['TPS']=sorted(d['TPS'],key=float)
@hughdbrown:非常正确……答案更新了。谢谢你指出这一点。
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)