リストを並べ替えるにはどうすればよいですか?[閉まっている]


107

リストがある場合、[a,b,c,d,e]どうすればアイテムを任意の方法で並べ替えることができ[d,c,a,b,e]ますか?

編集:私はそれらをシャッフルしたくありません。事前定義された方法でそれらを並べ替えたい。(たとえば、古いリストの3番目の要素が新しいリストの最初の要素になるはずです)



4
注文方法を指定せずに答えるのは難しいです。並べ替えますか?それらをシャッフルしますか?それらのいくつかを削除しますか?
Mizipzor 2010

@tvanfosson:この場合、任意は次のことも意味します:任意の(しかし明確に定義された)ソート関数を取る。
Felix Kling、2010

1
@mizipzor事前定義された方法で並べ替えたい。(これを明確にするために質問を編集しました)
Niyaz

@SilentGhost新しいインデックスが作成されます。4点かもしれません。ポイントは、アイテムの新しい順序を知っているということです。
Niyaz、2010

回答:


226

このようにできます

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']

これにより、新しい変数が作成されます。リストをインプレースで並べ替える方法は?ありがとう
交絡

:単純に最後の行を変更@Confoundedmylist[:] = [mylist[i] for i in myorder]
アダム


11
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]

@ wenlibin02、2.7.5の下で実行しただけで、問題なく動作します。何らかのエラーが発生しますか?
マーク

エラーなし、次のように入力するだけです。1)ランダムにインポートします。x = [1、2、3]; random.shuffle(x); #Noneを返します。2)np.random.shuffleを試しました。結果は同じです。
Libin Wen、

あ、ごめんなさい!xの値を直接変更することに気づきませんでした。Noneを返しました。そしてそれは機能します。ありがとう。
Libin Wen、


3
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']

2

独自のソート関数を提供して、次のことができます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回だけであるためです。


2
そして、どのように正確にこれを実装しますか?
SilentGhost 2010

@SilentGhost:これは一般的な回答を意味します。OPのケースでは、あなたの答えがより適切です。それにもかかわらず、私は一般的な解決策が存在することを知ることが重要だと思います。
Felix Kling、2010

2

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']

1
OPは、一般的なシャッフルではなく、特定の並べ替えを探しています。
Teepeemm

2

効率をあまり気にしない場合は、numpyの配列インデックスを利用してエレガントにすることができます。

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )

1

あなたの質問について私が理解していることから、で指定した順列を適用したいようです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

考えられるもう1つのことは、darklessによって指摘されたもう1つの解釈です。

Python 2.7のコード

主に:

  1. 値で並べ替え-すでに上記のAJで解決済み
  2. インデックスで並べ替え

    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']を出力します



-1

これは、この問題に遭遇したときに使用したものです。

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX:小文字用

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

リストを指定されたインデックスにシフトするだけです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.