python中的复杂排序

时间:2012-06-15 18:40:34

标签: python

我有以下元组列表:

items = [
    ('john jones', ['Director', 'Screenwriter', 'Producer']), 
    ('eric smith', ['Screenwriter']), 
    ('anne smith', ['Producer']), 
    ('emily smith', ['Director']), 
    ('steven jones', ['Director', 'Screenwriter'])
]

我需要对其进行排序,以便“编辑器”出现在“制作人”之前出现“导演”。其中的实际排序无关紧要。例如,这将是一个有效的结果:

items = [
    ('john jones', ['Director', 'Screenwriter', 'Producer']), 
    ('emily smith', ['Director']), 
    ('steven jones', ['Director', 'Screenwriter'])
    ('anne smith', ['Producer']), 
    ('eric smith', ['Screenwriter']), 
]

有没有办法做sorted(items, key=lambda x: ?)这样做,还是我必须迭代列表中的每个项目?

2 个答案:

答案 0 :(得分:3)

当然,有一种方法:

$ cat sort.py
order = ['Director', 'Screenwriter', 'Producer']
items = [
    ('john jones', ['Director', 'Screenwriter', 'Producer']), 
    ('eric smith', ['Screenwriter']), 
    ('anne smith', ['Producer']), 
    ('emily smith', ['Director']), 
    ('steven jones', ['Director', 'Screenwriter'])
]

for i in sorted(items, key = lambda x: order.index(x[1][0])):
    print i

我们试一试:

$ python sort.py
('john jones', ['Director', 'Screenwriter', 'Producer'])
('emily smith', ['Director'])
('steven jones', ['Director', 'Screenwriter'])
('eric smith', ['Screenwriter'])
('anne smith', ['Producer'])

当你想按姓名排序相同的国度时,你只需要一个元组(Lattyware的想法):

for i in sorted(items, key = lambda x: (order.index(x[1][0]), x[0])):
    print i

答案 1 :(得分:0)

以下是我认为最好的整体解决方案,主要是其他答案的混搭:

import collections

items = collections.OrderedDict([
    ('john jones', ['Director', 'Screenwriter', 'Producer']),
    ('emily smith', ['Director']),
    ('steven jones', ['Director', 'Screenwriter']),
    ('anne smith', ['Producer']),
    ('eric smith', ['Screenwriter']),
])

ordering = {'Director': 1, 'Screenwriter': 2, 'Producer': 3}

def order(item):
    name, values = item
    return ordering.get(values[0], float("inf")), name

print(sorted(items.items(), key=order))

给我们:

[('emily smith', ['Director']), ('john jones', ['Director', 'Screenwriter', 'Producer']), ('steven jones', ['Director', 'Screenwriter']), ('eric smith', ['Screenwriter']), ('anne smith', ['Producer'])]

不在ordering词典中的角色将放在最后。它们将首先按角色排序,然后按名称排序。

这假定子列表已预先排序。如果没有,则为easy to sort them first