Создать 2D список из строки с заданной длиной и шириной - PullRequest
0 голосов
/ 20 октября 2018

Как создать 2D список из строки с n-строками и 2 столбцами?

Пример:

str = "044010010A1A..."
list_2d = [['04','40'],
['10','01'],
['0A','1A']]...

Кто-нибудь может помочь?

Ответы [ 5 ]

0 голосов
/ 20 октября 2018

Если вы хотите использовать пустые массивы вместо двумерных списков, вы можете сделать следующий трюк:

>>> s = '044010010A1A'

>>> np.array([s]).view('<U2').reshape(-1, 2)

array([['04', '40'],
       ['10', '01'],
       ['0A', '1A']], dtype='<U2')

Это намного быстрее, чем использование списочного понимания, предложенного Евгений Ярмаш или itertools by jpp , и использование числовых массивов вместо 2D-списков, как правило, имеет больше преимуществ.Однако при необходимости вы можете преобразовать массив numy в список методом tolist().

0 голосов
/ 20 октября 2018

Вы можете использовать more_itertools.sliced дважды:

from more_itertools import sliced

s = '044010010A1A'

res = list(sliced(list(sliced(s, 2)), 2))

[['04', '40'], ['10', '01'], ['0A', '1A']]

Если вы не хотите импортировать третье лицо, вы можете определить sliced самостоятельно:

from itertools import count, takewhile

def sliced(seq, n):
    return takewhile(bool, (seq[i: i + n] for i in count(0, n)))
0 голосов
/ 20 октября 2018

Вы должны сами разобраться, что происходит, когда в вашей строке четное число элементов.Использование textwrap избавит вас от необходимости разбора.Это создаст равные части строки, которая в этом случае составляет 2

import textwrap
list = textwrap.wrap(str,2)
temp_list = []
for item in list:
  temp_list.append(item)
  if(len(temp_list)==2):
    list_2d.append(temp_list)
    temp_list = [] 
0 голосов
/ 20 октября 2018

первый: не называйте вашу строку str.Он уже используется Python.

import numpy as np
[list(l) for l in list(np.reshape(list(S),(int(len(S)/2),2)))]

numpy предоставляет быструю функцию для изменения формы списка.

0 голосов
/ 20 октября 2018

Вы можете использовать список понимания :

>>> s = '044010010A1A'
>>> [[s[i:i+2], s[i+2:i+4]] for i in range(0, len(s), 4)]
[['04', '40'], ['10', '01'], ['0A', '1A']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...