1

Python 3.2を使用していて、構成ファイルに基づいてタプルのリストを並べ替えたいと思います。

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

各タプルには次の情報が含まれています。

( title, size, format, provider )

このタプルのグループを最初にプロバイダーリストでソートしたいと思います。すべてのyyはQQとTTの前に来ます。

次に、この結果の順序を維持しながら、フォーマットに移動します。すべてのCCCはaaaの前にBBBの前にあります。

最後に、3番目の基準は、サイズ(フロート)で降順で並べ替えることです。

2番目のソートが最初のソートの順序を維持するように、各ステップで安定したソートを使用することが重要です。

どうすればこれをPythonのように行うことができますか?ありがとう。

編集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

これは基本的に@WinstonEwertの答えですが、完全に機能するコードです。dict()iterableを;に渡すことで辞書を作成できることに注意してください。ここでは、ジェネレータ式を作成して、から取得した結果を入れ替え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 に答える
1

フォーマットとプロバイダーのシーケンスを作成してから、現在の要素の値のインデックスを検索する複合キー(読み取り:タプル)を使用します。

于 2012-07-10T14:18:59.207 に答える
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 に答える