1

ここで本当に簡単な質問です。他の人が別の問題について私を助けてくれましたが、ここで非常に基本的なことを理解していないため、コードを機能させることができません。

8000.5   16745     0.1257
8001.0   16745     0.1242
8001.5   16745     0.1565
8002.0   16745     0.1595
8002.5   16745     0.1093
8003.0   16745     0.1644

私はそのようなデータファイルを持っています、そして私がタイプするとき

f1 = open(sys.argv[1], 'rt')
for line in f1:
    fields = line.split()
    print list(fields [0])

出力を取得します

['1', '6', '8', '2', '5', '.', '5']
['1', '6', '8', '2', '6', '.', '0']
['1', '6', '8', '2', '6', '.', '5']
['1', '6', '8', '2', '7', '.', '0']
['1', '6', '8', '2', '7', '.', '5']
['1', '6', '8', '2', '8', '.', '0']
['1', '6', '8', '2', '8', '.', '5']
['1', '6', '8', '2', '9', '.', '0']

印刷リスト(フィールド)のようなものを試してみて、次のようなものを取得することを期待していましたが

[16825.5, 162826.0 ....] 

私がここで見逃している明らかなことは何ですか?

ありがとう!

4

5 に答える 5

7

;を削除しlistます .split()すでにリストを返します。

フィールドの最初の要素をリストに変換します。

>>> fields = ['8000.5', '16745', '0.1257']
>>> fields[0]
'8000.5'
>>> list(fields[0])
['8', '0', '0', '0', '.', '5']

最初の列をリストにしたい場合は、次のようにリストを作成できます。

myfirstcolumn = []
for line in f1:
    fields = line.split()
    myfirstcolumn.append(fields[0])

これは、リスト内包に簡略化できます。

myfirstcolumn = [line.split()[0] for line in f1]
于 2012-05-30T12:48:13.227 に答える
6

最後のコマンドが問題です。

print list(fields[0])分割リストから0番目の項目を取得し、それを取得してリストに変換します。

すでに文字列のリストがあるので['8000.5','16745','0.1257']、0番目の項目は文字列であり、list()適用されると個々の要素のリストに変換されます。

于 2012-05-30T12:49:45.763 に答える
5

最初の問題はlist、文字列に適用することです。

list("123") == ["1", "2", "3"]

次に、printファイルの1行に1回ですが、各行の最初の項目を収集して、一度にすべて印刷したいようです。

第3に、Python 2では、の呼び出しに「t」モードはありませんopen(テキストモードがデフォルトです)。

私はあなたが欲しいものは次のとおりだと思います:

with open(sys.argv[1], 'r') as f:
    print [ line.split()[0] for line in f ]
于 2012-05-30T12:57:48.613 に答える
3

問題は、正しく抽出した最初のフィールドをに変換していたことでした。list

最初の列を印刷するための解決策は次のとおりです。

with open(sys.argv[1]) as f1:
   first_col = []
   for line in f1:
      fields = line.split()
      first_col.append(fields[0])

   print first_col

与える:

['8000.5', '8001.0', '8001.5', '8002.0', '8002.5', '8003.0']

実行するのではなく、終了時または例外の場合にファイルを閉じるf1 = open(sys.argv[1], 'rt')を使用することを検討してください。withまた、rtopen ()のデフォルトはreadモードとtextモードであるため、中断しました。

最後に、これはリスト内包表記を使用して記述することもできます。

with open(sys.argv[1]) as f1:
   first_col = [line.split()[0] for line in f1]
于 2012-05-30T12:49:06.877 に答える
2

他の人はすでにこの質問に答える素晴らしい仕事をしました、あなたが見ている行動はあなたがlist文字列で使用しているからです。 list繰り返し処理できるオブジェクトを取得して、一度に1つの要素をリストに変換します。オブジェクトにメソッドが必要ないことを除けば、これはそれほど驚くべきことではありません__iter__(文字列の場合)-SOに関する投稿が多数ある__iter__ので、その部分には焦点を当てません。

いずれにせよ、次のコードを試して、何が出力されるかを確認してください。

>>> def enlighten_me(obj):
...     print (list(obj))
...     print (hasattr(obj))
...
>>> enlighten_me("Hello World") 
>>> enlighten_me( (1,2,3,4) )  
>>> enlighten_me( {'red':'wagon',1:5} )

もちろん、セット、リスト、ジェネレーターを使って例を試すことができます...反復できるものなら何でも。

Levonは、ファイルを読みながら列を作成する方法についての良い答えを投稿しました。組み込みのzip機能を使用して同じことを示します。

rows=[]
for row in myfile:
    rows.append(row.split())

#now rows is stored as [ [col1,col2,...] , [col1,col2,...], ... ]

この時点で、(Levonの答え)によって最初の列を取得できます。

column1=[]
for row in rows:
    column1.append(row[0])

以上簡潔に:

column1=[row[0] for row in rows]  #<-- This is called a list comprehension

しかし、すべての列が必要な場合はどうでしょうか。(そして、列がいくつあるかわからない場合はどうなりますか?)これはの仕事ですzip

zipiterablesを入力として受け取り、それらを照合します。言い換えると:

zip(iter1,iter2)

iter1[0]を取得してiter2[0]と一致させ、iter1[1]をiter2[1]と一致させます。しかし、zipは2つ以上の引数を取ることができます...

zip(iter1,iter2,iter3) #results in [ [iter1[0],iter2[0],iter3[0]] , [iter1[1],iter2[1],iter3[1]], ... ]

さて、私たちが必要とするパズルの最後のピースは、スター演算子を使った引数の解凍です。関数がある場合:

def foo(a,b,c):
    print a
    print b
    print c

私はその関数を次のように呼び出すことができます:

A=[1,2,3]
foo(A[0],A[1],A[2])

または、次のように呼び出すことができます。

foo(*A)

うまくいけば、これは理にかなっています-スターはリスト内の各要素を取得し、それをfooに渡す前に「解凍」します。

したがって、ピースをまとめると(行のリストに戻ることを忘れないでください)、行のリストを解凍して、各行(つまり列)の対応するインデックスと一致するzipに渡すことができます。

columns=zip(*rows)

最初の列を取得するには、次のようにします。

columns[0]  #first column

zip(*list_of_lists)リストのリストについては、私は一種の貧乏人の転置として考えるのが好きです。

うまくいけば、これがお役に立てば幸いです。

于 2012-05-30T13:14:48.533 に答える