リストがある場合、[a,b,c,d,e]どうすればアイテムを任意の方法で並べ替えることができ[d,c,a,b,e]ますか?
編集:私はそれらをシャッフルしたくありません。事前定義された方法でそれらを並べ替えたい。(たとえば、古いリストの3番目の要素が新しいリストの最初の要素になるはずです)
リストがある場合、[a,b,c,d,e]どうすればアイテムを任意の方法で並べ替えることができ[d,c,a,b,e]ますか?
編集:私はそれらをシャッフルしたくありません。事前定義された方法でそれらを並べ替えたい。(たとえば、古いリストの3番目の要素が新しいリストの最初の要素になるはずです)
回答:
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]
最終的な順序はインデックスのリストによって定義されていますか?
>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]
>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']
編集:まあ。AJはより高速でした... Pythonでリストを並べ替えるにはどうすればよいですか?
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']
独自のソート関数を提供して、次のことができますlist.sort()。
sort()メソッドは、比較を制御するためのオプションの引数を取ります。
cmpは、2番目の引数(リストアイテム)のカスタム比較関数を指定します。これは、最初の引数が2番目の引数より小さい、等しい、または大きいかどうかに応じて、負、ゼロ、または正の数値を返します
cmp=lambda x,y: cmp(x.lower(), y.lower())。デフォルト値はNoneです。keyは、各リスト要素から比較キーを抽出するために使用される1つの引数の関数を指定します
key=str.lower。デフォルト値はNoneです。reverseはブール値です。Trueに設定すると、リスト要素は、各比較が逆にされたかのようにソートされます。
一般に、キーおよび逆変換プロセスは、同等のcmp関数を指定するよりもはるかに高速です。これは、各リスト要素に対してcmpが複数回呼び出されている間に、各要素にキーとリバースタッチが1回だけであるためです。
numpyを使用する場合は、きちんとした方法があります。
items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])
このコードは次を返します:
[1 3 2 0]
['b' 'd' 'c' 'a']
あなたの質問について私が理解していることから、で指定した順列を適用したいようですlist。これは、置換されたに表示されるオリジナルの要素のインデックスを保持する別のlist(それを呼び出しますp)を指定することによって行われます。次に、を使用して、各位置の要素を、インデックスがのその位置にある要素で置き換えます。listlistplistp
def apply_permutation(lst, p):
return [lst[x] for x in p]
arr=list("abcde")
new_order=[3,2,0,1,4]
print apply_permutation(arr,new_order)
これは印刷し['d', 'c', 'a', 'b', 'e']ます。
これにより実際に新しいが作成listされますが、元の「インプレース」を置換するように簡単に変更できます。
考えられるもう1つのことは、darklessによって指摘されたもう1つの解釈です。
Python 2.7のコード
主に:
インデックスで並べ替え
mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
print [item[0] for item in mylist]これは['c'、 'd'、 'b'、 'a'、 'e']を出力します
newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])