2014-12-02 2 views
-1

У меня есть блок нулей и единиц, в строке:Транспонирование блок текста

1111110000111111 
1110110110110111 
1101010110101011 
1011100110011101 
0001111111111011 
1000110111110111 
0100010011110000 
0110000001111110 
0111000000110110 
0000100010010100 
1110110011000111 
1101111111100011 
1011100110000011 
1101010111100001 
1110110110111101 
1111110000111111 

Я хочу, чтобы перенести его, как если бы это была матрица - но держать его в строке.

Прежде чем начать писать вложенные для циклов, есть ли более простой способ?

+0

'zip' упростит это, но вы должны' split' и ' join'. Это одна (многострочная) строка? – jonrsharpe

+0

Я предполагаю, что вы имеете в виду более простой способ без написания * явных * вложенных циклов 'for'. –

+0

Полусерьезный ответ: создайте класс Matrix с транспозицией и методами преобразования строк, затем выполните 's = Matrix.fromstring (s) .transposed(). Tostring()'. – Kevin

ответ

5
s = """1111110000111111 
     1110110110110111 
     1101010110101011 
     1011100110011101 
     0001111111111011 
     1000110111110111 
     0100010011110000 
     0110000001111110 
     0111000000110110 
     0000100010010100 
     1110110011000111 
     1101111111100011 
     1011100110000011 
     1101010111100001 
     1110110110111101 
     1111110000111111""" 

>>> [''.join(i) for i in zip(*s.split())] 
['1111010000111111', 
'1110001110110111', 
'1101000110101011', 
'1011100010011101', 
'1101110001111011', 
'1110111000110111', 
'0000100000010000', 
'0111110000011110', 
'0111111001111110', 
'0000111100110100', 
'1110111110010111', 
'1101111111000011', 
'1011100100000011', 
'1101010111100011', 
'1110110110111001', 
'1111110000111111'] 

Редактировать
Если вы действительно хотите одну строку в качестве выхода, добавьте еще один join

>>> '\n'.join(''.join(i) for i in zip(*s.split())) 
'1111010000111111\n1110001110110111\n1101000110101011\n1011100010011101\n1101110001111011\n1110111000110111\n0000100000010000\n0111110000011110\n0111111001111110\n0000111100110100\n1110111110010111\n1101111111000011\n1011100100000011\n1101010111100011\n1110110110111001\n1111110000111111' 
+0

Может быть, вы могли бы подробнее рассказать о звездочке в zip и о том, что делает zip? Это работает, но я действительно не понимаю. – MightyPork

+0

Кибер, спасибо за точку моего ответа. Не собираюсь беспокоиться об этом, так как ваша работа. Возможно, вы захотите добавить 'str.join', хотя, поскольку OP хотел, чтобы это была строка, а не список строк. – Ffisegydd

+0

@MightyPork Оператор asterisk [распаковывает аргументы] (http://stackoverflow.com/questions/2921847/what-does-the-star-operator-mean-in-python), в этом случае из 'split()' , ['zip'] (https://docs.python.org/3/library/functions.html#zip) затем берет последовательность итераций и соединяет их по-разному. Например, 'list (zip ('abc', 'def'))' производит '[('a', 'd'), ('b', 'e'), ('c', 'f')] '. – CoryKramer

Смежные вопросы