他の人はすでにこの質問に答える素晴らしい仕事をしました、あなたが見ている行動はあなたが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
。
zip
iterablesを入力として受け取り、それらを照合します。言い換えると:
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)
リストのリストについては、私は一種の貧乏人の転置として考えるのが好きです。
うまくいけば、これがお役に立てば幸いです。