我是脚本新手.我有一个table(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])
Run Code Online (Sandbox Code Playgroud)
这只是将列重现为列.我现在想做的是写最后一行,writer.writecol([values])但似乎没有这样的命令,我还没有找到另一种将行写为列的方法.
Man*_*ert 35
@Ashwini的答案是完美的.魔术发生在
zip(*lis)
Run Code Online (Sandbox Code Playgroud)
让我解释为什么这样做: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
Run Code Online (Sandbox Code Playgroud)
我们面临的问题是,在您的情况下,我们不知道我们想要传递多少个参数zip.但至少,我们已经知道了这些论点:它们是lis!lis是一个列表,该列表的每个元素也是一个列表(对应于输入文件中的一行数字).该*是告诉函数只是蟒蛇的方式"请使用任何的遵循与你的论点的元素,而不是事情本身!"
所以
lis = [[1,2,3], [4,5,6]]
zip(*lis)
Run Code Online (Sandbox Code Playgroud)
与...完全相同
zip([1,2,3], [4,5,6])
Run Code Online (Sandbox Code Playgroud)
恭喜,现在你是Python专家!;-)
Ash*_*ary 31
一般来说,转换一系列迭代的解决方案是:zip(*original_list)
样本输入:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
程序:
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')
Run Code Online (Sandbox Code Playgroud)
输出:
1 6 11
2 7 12
3 8 13
4 9 14
5 10 15
Run Code Online (Sandbox Code Playgroud)
Aka*_*all 23
由于我们讨论的是列,行和转置,所以值得一提 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]])
Run Code Online (Sandbox Code Playgroud)