29

私はスクリプトを書くのが初めてです。テーブル ( Table1.txt) があり、テーブル 1 の行が列に配置された別のテーブルを作成する必要があります。Perl と SQL ではこの問題の解決策を見つけましたが、Python では解決しませんでした。

私は 2 日前に Python の学習を始めたばかりなので、これは私が得た限りです。

import csv
import sys

with open(sys.argv[1], "rt") as inputfile:
   readinput = csv.reader(inputfile, delimiter='\t')
   with open("output.csv", 'wt') as outputfile:
      writer = csv.writer(outputfile, delimiter="\t")
      for row in readinput:
            values = [row[0], row[1], row[2], row[3]]
            writer.writerow([values])

これは、列を列として再現するだけです。私が今やりたかったことは、最後の行を次のように書くwriter.writecol([values])ことですが、そのようなコマンドはないようで、行を列として書く別の方法が見つかりませんでした。

4

5 に答える 5

38

@ Ashwiniの答えは完璧です。魔法が起こる

zip(*lis)

これが機能する理由を説明しましょう: zip は (最も単純なケースでは) 2 つのリストを取り、それらを "zip" します:zip([1,2,3], [4,5,6])になり[(1,4), (2,5), (3,6)]ます。したがって、外側のリストが行列で、内側のタプルが行であると考える場合、それは転置です (つまり、行を列に変えました)。

現在、zip任意のアリティの関数であるため、2 つ以上の引数を取ることができます。

# Our matrix is:
# 1 2 3
# 4 5 6
# 7 8 9

zip([1,2,3], [4,5,6], [7,8,9])

>>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

# Now it is
# 1 4 7
# 2 5 8
# 3 6 9

私たちが直面している問題は、あなたの場合、渡したい引数の数がわからないことですzip。しかし、少なくとも、引数については既に知っています。それらはlis!の要素です。lisはリストであり、そのリストの各要素もリストです (入力ファイルの 1 行の数値に対応します)。これは、関数に「それ自体ではなく、後続の要素を引数として使用してください!」*と伝える Python の方法です。

そう

lis = [[1,2,3], [4,5,6]]
zip(*lis)

とまったく同じです

zip([1,2,3], [4,5,6])

おめでとうございます。あなたは Python のプロです。;-)

于 2012-05-08T22:44:38.420 に答える
32

iterable のシーケンスを転置する一般的な解決策は次のとおりです。 zip(*original_list)

サンプル入力:

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15

プログラム:

with open('in.txt') as f:
  lis = [x.split() for x in f]

for x in zip(*lis):
  for y in x:
    print(y+'\t', end='')
  print('\n')

出力:

1   6   11  

2   7   12  

3   8   13  

4   9   14  

5   10  15
于 2012-05-08T22:01:28.613 に答える
24

列、行、転置について話しているので、おそらく言及する価値がありますnumpy

>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
>>> x
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> x.T
array([[ 1,  4,  7, 10],
       [ 2,  5,  8, 11],
       [ 3,  6,  9, 12]])
于 2012-05-08T22:56:43.207 に答える
2

@Akavallの回答に基づいて構築するために、ファイルから読み取りたい場合は、転置してから再度保存するだけです。

from numpy import genfromtxt, savetxt
data = genfromtxt('in.txt')
savetxt('out.txt',data.T)

data.T3行目は、データが転置される場所です。

于 2012-05-09T09:10:32.080 に答える
1

簡単にするために、オブジェクトを順番に出力したいだけだと仮定します。

  # lets read all the data into a big 2d array
  buffer = []
  for row in readinput: 
        values = [row[0], row[1], row[2], row[3]]  
        buffer.append(values)       

  # what you have in your code
  for i in range(len(buffer)):
      for j in range(len(buffer[0])):
          print buffer[i][j]

  # this is called a transpose; we have buffer[i][j] to read row then column, 
  #    switch i and j around to do the opposite
  for i in range(len(buffer[0])):
      for j in range(len(buffer)):
          print buffer[j][i]

に渡す配列が必要なので、writer.writerowこれを行うことができます

  for i in range(len(buffer[0])):
      writer.writerow([buffer[j][i] for j in range(len(buffer))])
于 2012-05-08T21:59:32.683 に答える