2016-09-22 2 views
2

私のアプリケーションではunitserrorsは常に数値のリストです。私は各部が何をしているのか調べてみて、ジッパーのモアの部分を考え出した。それはコードzip(* sorted(zip(units、errors)))は何をしますか?

ziped_list = zip(units, errors) 

は、単にペア単位とエラーを[...,(unit, error),...]としてリストを生成するようです。それはソートされたものに渡され、要素をソートします。私はkeyの引数を指定しなかったので、ドキュメントが示すように要素を直接比較します。

デフォルト値はNone(要素を直接比較)です。

ziped_listは整数のタプルのリストであるため、タプルを直接比較すると思われます。私の端末(のpython 3)の小さな例から、それはそれが最初の要素に基づいて比較するようです(ドキュメントが比較を意味していても、要素が賢明です):

>>> (1,None) < (2,None) 
True 
>>> (2,None) < (1,None) 
False 

最後のビット開梱してからまだ残っているジップ謎と私は彼らが何をするか把握することができませんでした。私は*が位置引数にアンパックすることを理解していますが、*を実行しても、コマンドラインで試してみると、その動作を正確に見ることはできません。私がさらに混乱しているのは、が、*sortedなどのアンパックリストを引き数として渡す必要がある理由です。これはすでに引数としてzip(*iterable)という変数がiterableという変数を取る場合です。私は入力としてイテラブルのリストを許可するものを解凍する必要があるのは混乱しているように思えます。

+1

タプルの比較は、最初の要素だけでなく、前述と同様に辞書編集的です。それがどのように動作するかを見るには、 '(1,1)'、 '(1,2)'、 '(2、1)'、 '(2、2) –

+0

@DietrichEpp多分私は辞書編集の意味を理解していないかもしれません。 – Pinocchio

+0

別名「アルファベット順」 –

答えて

3

リストをアンパックしない場合は、引数を1つの要素として渡すので、zipは各iterableの要素を集計できません。たとえば :

a = [3, 2, 1,] 
b = ['a', 'b', 'c'] 
ret = zip(a, b) 
the_list = sorted(ret) 
the_list >> [(1, 'c'), (2, 'b'), (3, 'a')] 

zip(*the_list)zip((1, 'c'), (2, 'b'), (3, 'a'))

出力に等しい:[((1, 'c'),), ((2, 'b'),), ((3, 'a'),)]

することができますも:あなただけzip(the_list)を使用する場合は[(1, 2, 3), ('c', 'b', 'a')]

zip([(1, 'c'), (2, 'b'), (3, 'a')],)

出力に等しく、見る What does ** (double star) and * (star) do for Python parameters?

1

あなたはすでにzipが何をしているかを理解したようです。

ジップリストをソートすると、sortedは各タプルの最初の要素を比較し、リストをソートします。最初の要素が等しい場合、その順序は2番目の要素によって決定されます。

*オペレータはソートされたリストをアンパックします。

最後に、第2のzipは出力を再結合します。

最後に、タプルの2つのリストがあります。最初のリストは、最小から最大にソートされたエラーです。 2番目のリストは対応するエラーです。

関連する問題