0

次のタプルのリストがあります。

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: ?)か、それともリスト内の各項目を繰り返す必要がありますか?

4

2 に答える 2

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
于 2012-06-15T18:45:12.060 に答える
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口述にない役割は最後に配置されます。それらは最初に役割でソートされ、次に名前でソートされます。

これは、サブリストが事前にソートされていることを前提としています。そうでない場合は、最初にそれらを並べ替えるのは簡単です。

于 2012-06-15T19:02:12.433 に答える