首页>Program>source

我是脚本新手.我有一张桌子( Table1.txt ),我需要创建另一个表,该表的Table1行按列排列,反之亦然.对于Perl和SQL,我找到了解决此问题的方法,但是对于Python,却没有找到解决方法。

两天前我才刚开始学习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]) 但是似乎没有这样的命令,而且我还没有找到将行写为列的另一种方法。

最新回答
  • 2021-1-11
    1 #

    一般而言,转置可迭代序列的解决方案是:zip(* original_list)< / p>

    样本输入:

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

    program:

    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')
    

    output:

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

  • 2021-1-11
    2 #

    @Ashwini的答案很完美.魔术发生在

    zip(*lis)
    

    让我解释一下它为什么起作用:zip接收(在最简单的情况下)两个列表,然后"压缩"它们: zip([1,2,3], [4,5,6]) 将成为 [(1,4), (2,5), (3,6)] .因此,如果您将外部列表视为矩阵,将内部元组视为行,则这是一种换位(即,我们将行变成了列).

    现在, zip 是任意Arity的函数,因此它可能需要两个以上的参数:

    # 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 是一个列表,该列表的每个元素也都是一个列表(对应于输入文件中的一行数字).维兹威兹 只是Python告诉函数的一种方法"请使用以下所有元素作为参数,而不是事物本身!"

    所以

    *
    

    完全相同
    lis = [[1,2,3], [4,5,6]]
    zip(*lis)
    

    恭喜,您现在是Python专业人士! ;-)

  • 2021-1-11
    3 #

    既然我们在谈论列,行和转置,也许值得一提 zip([1,2,3], [4,5,6])

    numpy
    

  • 2021-1-11
    4 #

    这是一种方法,为简单起见,假设您只想按顺序print出对象:

    >>> 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]])
    

    因为您需要一个数组才能传递给 # 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
    

  • 2021-1-11
    5 #

    只需在@Akavall答案上构建,如果您想从文件中读取,转置然后再次保存就可以了:

     for i in range(len(buffer[0])):
          writer.writerow([buffer[j][i] for j in range(len(buffer))])
    

    from numpy import genfromtxt, savetxt data = genfromtxt('in.txt') savetxt('out.txt',data.T) 第三行是数据转置的位置。

    data.T

  • windows phone 7:使用Silverlight在wP7应用程序中显示GIF
  • css:柔性盒模型-显示:flex,box,flexbox?