2012-01-05 13 views
0

私はこのようになり、ネストされたリストを持っている:2つの異なるリストアイテムと並べ替え/再シャッフルに基づいて複数アイテムの並べ替えを行いますか?

li = [['m', 'z', 'asdgwergerwhwre'], 
     ['j', 'h', 'asdgasdgasdgasdgas'], 
     ['u', 'a', 'asdgasdgasdgasd'], 
     ['i', 'o', 'sdagasdgasdgdsag']] 

を私はアルファベット順にリストを並べ替えることが好きですが、各サブリストにおける第一又は第二の要素のいずれかを使用します。上記の例では、希望の出力は次のようになります。

['a', 'u', 'asdgasdgasdgasd'] 
['h', 'j', 'asdgasdgasdgasdgas'] 
['i', 'o', 'sdagasdgasdgdsag'] 
['m', 'z', 'asdgwergerwhwre'] 

この種のソートを達成する最良の方法は何ですか?

+1

それだけでソートではなく、内側の変換 –

答えて

1

と第二aplly簡単な並べ替えで:

>>> sorted(map(lambda x: sorted(x[:2]) + [x[2]], li)) 
[['a', 'u', 'asdgasdgasdgasd'], 
['h', 'j', 'asdgasdgasdgasdgas'], 
['i', 'o', 'sdagasdgasdgdsag'], 
['m', 'z', 'asdgwergerwhwre']] 
+0

ありがとうございました。私のソートは非常に大きいので、あなたのコードとリファクタリングを使い、理解しやすくなりました。x =ソート済み(ソート済み(x [:2])+ x [2] for li) ' – drbunsen

1

組み込みのメソッドsorted()を使用して、このうちのいくつかを実行できます。印刷方法を逆にしたい場合はリストの順序を逆にする必要がありますが、これはあまり難しくありません。

def rev(li): 
    for l in li: 
     l[0], l[1] = l[1], l[0] 
    return li 

new_list = sorted(rev(li)) 

特定のインデックスに基づいてリストをソートする場合は、sorted(li, key=lambda li: li[index])を使用できます。我々は(最初の2つの項目のためのスワップを - 必要に応じて)いくつかの変換を行う第一段階として

+0

I彼が単に[1]と[0]を交換したかったとは思わない、私は彼がそれらを並べ替えることを望んでいたと思う。 l [0] = min(l [1]、l [0])、max(l [1]、l [0]) –

0
import pprint 
li = [['m', 'z', 'asdgwergerwhwre'], 
     ['j', 'h', 'asdgasdgasdgasdgas'], 
     ['u', 'a', 'asdgasdgasdgasd'], 
     ['i', 'o', 'sdagasdgasdgdsag']] 

for _list in li: 
    _list[:2]=sorted(_list[:2]) 

pprint.pprint(sorted(li)) 

>>> 
[['a', 'u', 'asdgasdgasdgasd'], 
['h', 'j', 'asdgasdgasdgasdgas'], 
['i', 'o', 'sdagasdgasdgdsag'], 
['m', 'z', 'asdgwergerwhwre']] 
関連する問題