我有以下元组列表:
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: ?)
这样做,还是我必须迭代列表中的每个项目?
答案 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。