3

私はここではPythonの初心者であり、かなり単純な問題に直面しています。これを解決するための最も効率的な方法を探しています。したがって、次の5つのリストがあります。

a,b,c,d,score

上記のリストはすべて同じサイズです(私の場合は500)。a,b,c,d文字列リストでscoreあり、intリストです。

私がやりたいのはa,b,c,d、の昇順または降順の並べ替えに基づいて並べ替えることですscore。したがって、最初にscore降順のパターンに基づいて並べ替えてからa,b,c,d、並べ替えられたスコアリストに基づいて(同じ順序で)対応する要素を並べ替えます。

私はenumerateこれを達成することを考えていましたが、itertoolsここでそれをより速く、より効率的にするために使用できるかどうか疑問に思っています。

これをどのように達成できるかについてのガイダンスは大歓迎です&&これが101の質問である場合は申し訳ありません。

4

2 に答える 2

6
sorted_lists = sorted(izip(a, b, c, d, score), reverse=True, key=lambda x: x[4])
a, b, c, d, score = [[x[i] for x in sorted_lists] for i in range(5)]

この最初のステップでzipは、リストをまとめます。これは、すべてのリストから最初の要素を取得してそれらをタプルに入れ、そのタプルを新しいリストに追加してから、すべてのリストの2番目の要素に対して同じことを行います。次に、このタプルのリストを5番目の要素で並べ替えます(これは、key引数に渡された無名関数からのものです)。reverse=Trueリストが降順になるように設定します。

2番目のステップでは、ネストされたリスト内包表記とタプルの解凍を使用してリストを分割します。リストの新しいリストを作成します。ここで、各内部リストは、の各タプルのすべての最初の要素ですsorted_lists。以下のように1行でこれを行うことができますが、2つに分割する方が少し明確かもしれません。

a, b, c, d, score = izip(*sorted(izip(a, b, c, d, score), reverse=True,
                         key=lambda x: x[4]))

タプルのリストを返すジェネリック関数を次に示します。タプルはソートされたリストです。

def sort_lists_by(lists, key_list=0, desc=False):
    return izip(*sorted(izip(*lists), reverse=desc,
                 key=lambda x: x[key_list]))
于 2013-03-25T09:03:10.663 に答える
3

多くの数値作業や配列操作を行っている場合は、を使用することを検討する価値があるかもしれませんnumpy。この問題は、numpy配列を使用すると非常に簡単に解決できます。

In [1]: import numpy as np
In [2]: a = ['hi','hello']
In [3]: b = ['alice','bob']
In [4]: c = ['foo','bar']
In [5]: d = ['spam','eggs']
In [6]: score = [42,17]

これから、形式でタプルのリストを作成し、(a,b,c,d,score)それぞれをdtypeで格納します。また、後でアクセスする(str,str,str,str,int)ために名前を付けることもできます。('a','b','c','d','score')

In [7]: data = np.array(zip(a,b,c,d,score),
   ...:         dtype = [('a','S5'),('b','S5'),('c','S5'),('d','S5'),('score',int)]
   ...:     )

In [8]: data
Out[8]: 
array([('hi', 'alice', 'foo', 'spam', 42),
       ('hello', 'bob', 'bar', 'eggs', 17)], 
      dtype=[('a', 'S5'), ('b', 'S5'), ('c', 'S5'), ('d', 'S5'), ('score', '<i8')])

この配列の利点は、名前ですべての「リスト」(フィールド)にアクセスできることです。

In [9]: data['a']
Out[9]: 
array(['hi', 'hello'], 
      dtype='|S5')

In [10]: data['score']
Out[10]: array([42, 17])

それらを並べ替えるには、並べ替えるフィールドの名前を指定するだけです。

In [11]: sdata = np.sort(data, order='score')

In [12]: sdata
Out[12]: 
array([('hello', 'bob', 'bar', 'eggs', 17),
       ('hi', 'alice', 'foo', 'spam', 42)], 
      dtype=[('a', 'S5'), ('b', 'S5'), ('c', 'S5'), ('d', 'S5'), ('score', '<i8')])

In [13]: sdata['b']
Out[13]: 
array(['bob', 'alice'], 
      dtype='|S5')
于 2013-03-26T17:21:29.467 に答える