1

我正在使用 Python 3.2,并希望根据配置文件对元组列表进行排序:

formats=CCC;aaa;BBB
providers=yy;QQ;TT

每个元组都包含以下信息:

( title, size, format, provider )

我希望这组元组首先按提供者列表排序。所有 yy 都在 QQ 和 TT 之前。

然后,保持这个结果顺序,进入格式。所有 CCC 在 aaa 之前在 BBB 之前。

最后,第三个标准是按大小(浮点数)按降序排序。

至关重要的是,每个步骤都使用稳定的排序,以便二级排序保持第一个排序的顺序,依此类推。

我怎样才能以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)
4

4 回答 4

3
def sort_key(data):
    title, size, format, provider = data
    return p_dict[provider], f_dict[format], -size 

print sorted( mydata, key = sort_key)

基本上,设计一个关键函数来生成将按所需顺序排序的元组。

于 2012-07-10T17:27:11.283 回答
1

创建格式和提供程序的序列,然后使用复合键(读取:元组)查找当前元素中值的索引。

于 2012-07-10T14:18:59.207 回答
1

这基本上是@Winston Ewert 的答案,但它是完整的工作代码。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)
于 2012-07-10T17:54:44.763 回答
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 排序是稳定的,因此您也可以先按大小降序排序,然后按格式排序,然后按提供者排序。

于 2012-07-10T17:28:52.020 回答