2

現在直面している状況で最適化する方法があるかどうか興味があります。

データをグループ化して並べ替えるためのカテゴリを表す文字列のリストがあります。

['first', 'third', 'second']

これは、それらに従ってソートする必要があるカテゴリのオブジェクトを含む dict のリストに対応します。

[{'color':'yellow', 'section':'third'},{'color':'red', 'section':'first'}, {'color': 'blue', 'section':'second'}]

データ リストは、最初のセットで指定された順序で並べ替える必要があります。この場合、次のようになります。

[{'color':'red', 'section':'first'},{'color':'yellow', 'section':'third'},{'color': 'blue', 'section':'second'}]

私の現在の解決策:

sortedList = []
for section in orderList:
  for item in dataList:
    if item['section'] == section: sortedList.append(item)

これをソートできるよりクリーンな方法はありますか?

4

5 に答える 5

3

組み込みsorted関数を使用できます。

>>> lst = ['first', 'third', 'second']
>>> dcts = [{'color':'yellow', 'section':'third'}, {'color':'red', 'section':'first'}, {'color': 'blue', 'section':'second'}]
>>> sorted(dcts, key=lambda dct: lst.index(dct['section']))
[{'section': 'first', 'color': 'red'}, {'section': 'third', 'color': 'yellow'}, {'section': 'second', 'color': 'blue'}]
于 2013-03-28T09:18:29.320 に答える
3
>>> dicts = [{'color':'yellow', 'section':'third'},{'color':'red', 'section':'first'}, {'color': 'blue', 'section':'second'}]
>>> L = ['first', 'third', 'second']
>>> order = dict(zip(L, range(len(L)))) # Dictionary for O(1) lookup
>>> sorted(dicts, key=lambda d: order[d['section']])
[{'color': 'red', 'section': 'first'}, {'color': 'yellow', 'section': 'third'}, {'color': 'blue', 'section': 'second'}]

このメソッドは、並べ替えの O(N log N) ではなく O(N) になります。

>>> sorted_sections = ['first', 'third', 'second']
>>> dicts = [{'color':'yellow', 'section':'third'},{'color':'red', 'section':'first'}, {'color': 'blue', 'section':'second'}]
>>> dict_by_section = {d['section']:d for d in dicts}
>>> [dict_by_section[section] for section in sorted_sections]
[{'color': 'red', 'section': 'first'}, {'color': 'yellow', 'section': 'third'}, {'color': 'blue', 'section': 'second'}]
于 2013-03-28T09:19:33.460 に答える
2

sorted()次のように使用できますkey

In [6]: o = ['first', 'third', 'second']

In [7]: l = [{'color':'yellow', 'section':'third'},{'color':'red', 'section':'first'}, {'color': 'blue', 'section':'second'}]

In [8]: sorted(l, key=lambda x:o.index(x['section']))
Out[8]: 
[{'color': 'red', 'section': 'first'},
 {'color': 'yellow', 'section': 'third'},
 {'color': 'blue', 'section': 'second'}]

これは に対して線形検索を行いoます。o大きくなる可能性がある場合は、@jamylak のソリューションを優先する必要があります。

于 2013-03-28T09:18:09.203 に答える
2

より最適化されたバージョンは次のとおりです。

sort_key = lambda x: ks.index(x['section'])

print(sorted(dicts, key=sort_key))
于 2013-03-28T09:18:32.187 に答える
0
orderList = ['first', 'third', 'second']
dataList = [{'color':'yellow', 'section':'third'},{'color':'red', 'section':'first'}, {'color': 'blue', 'section':'second'}]

orderDict = dict((v,offset) for offset, v in enumerate(orderList))

print sorted(dataList, key=lambda d: orderDict[d['section']])
于 2013-03-28T09:26:41.780 に答える