3

Python の初心者です。誰かの知性を侮辱するつもりはありません。

私は大きなリストを持っており、一連のIDと関連する値が含まれています.非常に短縮されたバージョンは次のようになります:

large = [('550111', [(4, 5, 8), (6, -4, -6)]), ('222211', [(2, -4, 5), (1, 15, -4)])]

理想的な形式をExcelにエクスポートするようなコードがありますが、必要な変更はありません:

import csv
with open("out1.csv", "wb") as fp: 
 writer = csv.writer(fp, delimiter=",")     
for entry in large:        
 writer.writerow([entry[0]])         
for line in entry[1]:             
 writer.writerow(line)        
 writer.writerow([])

これから Excel への出力(独自の個別のセルを持つすべての値 - 5501 は A1、4 は A2、5 は B2、8 は C2...最初のスペースは A4 など)のようになります。

550111 
4,5,8 
6,-4,-6  
<space here - dont know how to put them in>
222211 
2,4,-5 
1,-15, 4 
 <space here - dont know how to put them in>

これは完璧ですが、値の絶対最大値も生成したいと考えています。ここで助けが必要です。リストに関数を適用できないというエラーが表示され続けるため、エクスポート コードに絶対最大関数を書き込む方法がわかりません。

また、最後に 1 から 8904 までの数値シーケンスを挿入する必要があります。

Excel にエクスポートされた後の目的のフォーム -絶対最大値 (neggressinf '-' 記号) と並べ替えられた絶対最大値があります

550111 
4,5,8 
6,-4,-6
'space here'
'Max:'
6, 5, 8
'Sorted max'
8, 6, 5
'space here'     
222211 
2,4,-5 
1,-15,4
'space here'
'Max:'
2, 15, 5
'Sorted max:' 
15, 5, 2
'space here'
1, 2, 3, ........, 8904 

質問が迷惑/新人/些細なことでしたら申し訳ありません。助けて本当に感謝しています。

4

3 に答える 3

2

次のコード フラグメントは、最大値と並べ替えられた最大値を取得するのに役立つと思います。申し訳ありませんが、それらを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

お役に立てれば

于 2012-08-14T10:58:07.903 に答える
0

これがpythonかExcelの質問かどうかはわかりませんが、Excelの場合:「1ステップでの範囲内の絶対値の最大値」の関数は次のとおりです。

=MAX(INDEX(ABS(F17:F22),0,1))

私はPythonに精通していませんが、数式をセルに挿入する方法があると確信しています. 幸運を。

ソース: http://www.mrexcel.com/forum/showthread.php?47999-Maximum-of-absolute-values-within-a-range-in-one-step

https://groups.google.com/forum/?fromgroups#!topic/python-excel/bRDXSVWstxo%5B1-25%5D

于 2012-08-10T16:32:09.703 に答える
0

xlwtモジュールを使用すると、動的な Excel 式を利用するために、CSV の代わりにバイナリ Excel ファイル形式に直接エクスポートできます

これは、65,000 行以下のスプレッドシートでは問題ありません (xlwt で使用される古い Excel 形式の制限)。

[アップデート]

私はあなたが何を望んでいるのか理解できませんでした。最大値を計算したい場合は、それを実行してください。

import csv
with open("out1.csv", "wb") as fp: 
    writer = csv.writer(fp, delimiter=",")
    for entry, data in large:
        values = []
        writer.writerow([entry])
        for line in data:             
            writer.writerow(line)
            values.extend(line)
        writer.writerow([])
        writer.writerow(['Sorted Max'])
        writer.writerow(sorted(values, reverse=True)[:3])
        writer.writerow([])

[アップデート]

ここでは長いコメントは歓迎されないので、チャット ルームに移動するように依頼しました。私には自分の仕事があり、回答に数分かかる場合があることに注意してください. 覚えておいてください、私はあなたを助けるために志願しています. あなたが私の助けに値するなら、私はあなたの忍耐に値します.

「abs max」とは、データセット内で発生する順序と同じ順序で上位 3 つの整数を意味しますか?

top3 = sorted(values, reverse=True)[:3]
absmax = filter(lambda x: x in top3, values)

「最後に」とは、右側にいくつかの列があることを意味しますか? xlwt モジュールを使用すると、行/列を正確に制御できますが、csv モジュールを使用すると、自分で列を埋める必要があります。次の例をユースケースに合わせてください。

c = 1
for a in range(10):
    writer.writerow([a, ' ', ' ', c])
    c += 1
    writer.writerow([a+1, a+2, a+3, c])
    c += 1
    writer.writerow([' ', ' ', ' ', c])
    c += 1

結果:

0, , ,1
1,2,3,2
 , , ,3
1, , ,4
2,3,4,5
 , , ,6
2, , ,7
3,4,5,8
 , , ,9
...
于 2012-08-14T08:21:31.900 に答える