次のコード フラグメントは、最大値と並べ替えられた最大値を取得するのに役立つと思います。申し訳ありませんが、それらをExcelに入れるのを手伝うことはできません
for entry in large:
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(z))
print max_list
max_list.sort(reverse=True)
print max_list
[6, 5, 8]
[8, 6, 5]
[2, 15, 5]
[15, 5, 2]
基本的に、大規模なデータセットのすべてのエントリに対して、エントリ1リスト (タプルのリスト) を処理する必要があります。zip を使用すると、複数のデータ構造を同時に「圧縮」できます。
zip(*entry[1])
この行は基本的に、リスト内のすべてのタプルを展開し、それらを同時にループします。したがって、最初の反復中に、すべてのタプルのすべての最初の要素が選択され、タプルとして保存されます。
max 関数を使用すると、最大値を取得して別のリスト (エントリごとに新しいリスト) に格納できます。次に、そのリストを逆に並べ替えて、必要なものを取得できます
編集
絶対最大値が必要なことに気付きました。したがって、コードフラグメントは次のように変更されます
for entry in large:
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(abs(t) for t in z))
print "Absolute max",max_list
max_list.sort(reverse=True)
print "Sorted Absolute Max",max_list
入力
large = [('5501', [(4, -5, 8), (6, -4, -6)]), ('2222', [(2, -4, 5), (1, -15, -4)])]
出力
Absolute max [6, 5, 8]
Sorted Absolute Max [8, 6, 5]
Absolute max [2, 15, 5]
Sorted Absolute Max [15, 5, 2]
EDIT2
zip と編集されたコードについて質問されたので、これについて説明します。
zip()は、複数の iterable (リスト、タプル、および反復できるその他のもの) を並列に反復するのに役立つ組み込みの python 関数です。
>>> a=[1,2,3,]
>>> b=[4,5,6,]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
結果の i 番目のタプルは、入力リストの i 番目の要素のコレクションです
あなたのケースentry[1]
では、「圧縮」したいタプルのリストですが、リストの単一のリストではなく複数のリストを指定した場合にのみ、zip が機能します!
ここで* 演算子が役に立ちます。リストのリストを複数のリストに分割します。
>>> def printme(*a):
... for i in a:
... print i
...
>>> m=[(1,2,),(3,4,),(5,6,),]
>>> printme(m)
[(1, 2), (3, 4), (5, 6)]
>>> printme(*m)
(1, 2)
(3, 4)
(5, 6)
リスト内の最大値を見つけたい場合は、組み込みのmax()関数を使用できます。
これで、問題を解決するために必要なすべての理論的要素が揃いました。まあ言ってみれば
>>> entry=('5501', [(4, -5, 8), (6, -4, -6)])
>>> entry[1]
[(4, -5, 8), (6, -4, -6)]
あなたがしたいことは、すべての最初の要素が別のタプルを形成し、すべての 2 番目の要素が別のタプルを形成するように、これらのタプルを圧縮することです。
>>> zip(entry[1])
[((4, -5, 8),), ((6, -4, -6),)]
ダメ!!!を使用しましょう*
>>> zip(*entry[1])
[(4, 6), (-5, -4), (8, -6)]
完全!リスト内のタプルごとに max() を実行して最大値を見つけ、それをどこかに保存するだけです。
>>> for z in zip(*entry[1]):
... print "I have",z
... print "max is",max(z)
...
I have (4, 6)
max is 6
I have (-5, -4)
max is -4
I have (8, -6)
max is 8
したがって、空のリストを初期化し、それに最大値を追加すると、最大値リストが得られます! したがって、私が書いた最初のコード
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(z))
print max_list
私たちに与えます
[6, -4, 8]
max_list 自体をソートするには、リストの sort メソッドを使用します
max_list.sort(reverse=True)
print max_list
私たちに与えます
[8, 6, -4]
しかし、値の絶対最大値が必要です。
上記のコード フラグメントでz
は、 が値を保持します。したがって、これらの値を絶対値に変換する方法が必要です。組み込みのabs()は数値に対してのみ機能するため、z の各要素に適用する必要があります
>>> for z in zip(*entry[1]):
... print z
... new_z = []
... for i in z:
... new_z.append(abs(i))
... print new_z
...
(4, 6)
[4, 6]
(-5, -4)
[5, 4]
(8, -6)
[8, 6]
または、pythonic にして短くすることもできます
>>> for z in zip(*entry[1]):
... print z
... new_z=[abs(i) for i in z]
... print new_z
...
(4, 6)
[4, 6]
(-5, -4)
[5, 4]
(8, -6)
[8, 6]
しかし、最大値も必要ですnew_z
。それは簡単max(new_z)
です。私たちのコードは今
max_list=[]
for z in zip(*entry[1]):
new_z=[abs(i) for i in z]
max_list.append(max(new_z))
print max_list
それは私たちに与えます
[6, 5, 8]
これが私たちが望むものです。しかし、待ってください、まだコードを短縮できます
new_z=[abs(i) for i in z]
max_list.append(max(new_z))
単線に変換可能
max_list.append(max( abs(t) for t in z ))
これにより、最終的なコードが表示されます
for entry in large:
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(abs(t) for t in z))
print "Absolute max",max_list
max_list.sort(reverse=True)
print "Sorted Absolute Max",max_list
お役に立てれば