Все это хорошо, но seq предположительно устарел, и большинство из них работают только с числовыми диапазонами.
Если вы заключите цикл for в двойные кавычки, стартовые и конечные переменные будут разыменованы, когда вы будете эхо-строки , и вы можете отправить строку обратно в BASH для выполнения. $i
должен быть экранирован, поэтому он НЕ оценивается перед отправкой на подоболочку.
RANGE_START=a
RANGE_END=z
echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash
Этот вывод также может быть назначен переменной:
VAR=`echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash`
Единственный «служебный» ресурс, который должен генерировать, должен быть вторым экземпляром bash, поэтому он должен быть подходящим для интенсивных операций.
Решение для транспонирования последовательности итераций в целом: 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
Поскольку речь идет о столбцах, строках и транспонировании, возможно, стоит упомянуть 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]])
Вот один из способов сделать это, для простоты предположим, что вы просто хотите распечатать объекты по порядку:
# 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))])
@ Ответ Ашвини идеален. Магия случается в
zip(*lis)
Позвольте мне объяснить, почему это работает: zip берет (в простейшем случае) два списка и «зипирует» их: zip([1,2,3], [4,5,6])
станет [(1,4), (2,5), (3,6)]
. Поэтому, если вы рассматриваете внешний список как матрицу, а внутренние кортежи - как строки, это транспонирование (т. Е. Мы превратили строки в столбцы).
Теперь zip
является функцией произвольной арности, поэтому она может принимать более двух аргументов:
# 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
- это список, и каждый элемент этого списка также является списком (соответствует одной строке чисел во входном файле). *
- это просто способ выражения функции Pythons «пожалуйста, используйте в качестве аргументов элементы всего, что следует, а не саму вещь!»
Итак
lis = [[1,2,3], [4,5,6]]
zip(*lis)
точно так же, как
zip([1,2,3], [4,5,6])
Поздравляю, теперь вы профессионал в Python! ; -)
Просто для построения ответа @Akavall, если вы хотите прочитать из файла, транспонировать и затем сохранить снова, просто сделайте:
from numpy import genfromtxt, savetxt
data = genfromtxt('in.txt')
savetxt('out.txt',data.T)
data.T
в 3-й строке, где данные транспонируются .