我正在使用Python 3.2,并希望根据配置文件对元组列表进行排序:
formats=CCC;aaa;BBB
providers=yy;QQ;TT
每个元组都包含以下信息:
( title, size, format, provider )
我希望这组元组首先按提供者列表排序。所有的yy都来自QQ和TT。
然后,保持此结果顺序,转到格式。所有CCC都在BBB之前的aaa之前。
最后,第三个标准是按大小(浮动)排序,按降序排列。
每个步骤使用稳定排序至关重要,以便辅助排序保持第一种排序等等。
我怎样才能以pythonic的方式做到这一点?感谢。
编辑1
这是我尝试过的,因为sorted(mydata)
,我显然无法工作。在这种情况下,mydata不能成为一个列表。
providers="yy;QQ;TT"
formats="CCC;aaa;BBB"
p_dict = {}
f_dict = {}
for k,v in enumerate(providers.split(';')):
p_dict[k] = v
for k,v in enumerate(formats.split(';')):
f_dict[k] = v
mydata = (
('title1', 423.4, 'QQ', 'aaa'),
('title2', 523.2, 'TT', 'CCC'),
('title3', 389.0, 'yy', 'aaa'),
('title4', 503.2, 'QQ', 'BBB') )
sort1 = sorted( mydata, key=p_dict.__getitem__)
print(sort1)
答案 0 :(得分:3)
def sort_key(data):
title, size, format, provider = data
return p_dict[provider], f_dict[format], -size
print sorted( mydata, key = sort_key)
基本上,设计一个关键函数,生成将按所需顺序排序的元组。
答案 1 :(得分:1)
创建格式和提供程序的序列,然后使用复合键(读取:tuple)查找当前元素中值的索引。
答案 2 :(得分:1)
这基本上是@Winston Ewert的答案,但它是完整的工作代码。请注意,您可以通过将iterable传递给dict()
来创建字典;这里我们创建一个生成器表达式来交换我们从enumerate()
得到的结果。
providers="yy;QQ;TT"
formats="CCC;aaa;BBB"
d_providers = dict((k, v) for v, k in enumerate(providers.split(';')))
d_formats = dict((k, v) for v, k in enumerate(formats.split(';')))
def key_mydata(m):
return (d_providers[m[2]], d_formats[m[3]], -m[1], m[0])
mydata = (
('title1', 423.4, 'QQ', 'aaa'),
('title2', 523.2, 'TT', 'CCC'),
('title3', 389.0, 'yy', 'aaa'),
('title4', 503.2, 'QQ', 'BBB') )
sort1 = sorted(mydata, key=key_mydata)
print(sort1)
答案 3 :(得分:0)
使用将每个部分转换为索引的键函数:
providers = providers.split(';')
formats = formats.split(';')
def sort_key(item):
title, size, format, provider = item
return (providers.index(provider), formats.index(format), -size, title)
print(sorted(mydata, key=sort_key))
请注意,Python排序是稳定的,因此您也可以按大小排序先排序,然后按格式排序,然后按提供程序排序。