2016-01-07 3 views
1

Я хочу разбить массив на подматрицу. Исходные данные:Почему существует «массив» в результате разделения? (Python)

['4 2','1 4','1 4'] 
['4 1','4 1','3 1'] 
['3','2','1'] 

результат я хочу получить это:

['4','1','1'] 
['2','4','4'] 
['4','4','3'] 
['1','1','1'] 
['3','2','1'] 

Так что мой код:

raw = [['4 2','1 4','1 4'],['4 1','4 1','3 1'],['3','2','1']] 
newraw =[] 
for item in raw: 
    #print item 
    numberOfRow = len(item[0].split(" ")) 
    temp = np.empty((numberOfRow,5)) 


    for i in range(len(item)): 
     test = item[i].split(" ") 
     for j in range(len(test)): 
      temp[j,i]=test[j] 
    for it in temp: 
     newraw.append(it) 
print newraw 

Когда я print newraw, я обнаружил проблемы: (1) , результат содержит нецелые числа, (2) результаты содержат [array([...])..., но я не знаю почему.

Итак, есть ли какое-либо решение, или есть какой-либо простой способ получить результат, который я хочу? Спасибо ~

+0

Ваши данные не являются нормальными. Некоторые из них разделены пробелами и некоторые цифры. Это будет немного странно. – erip

ответ

5

Не могли бы вы просто сделать это так?

x = [['4 2','1 4','1 4'], 
['4 1','4 1','3 1'], 
['3','2','1']] 

res = [] 
for i in x: 
    res.extend(map(list, zip(*(j.split(" ") for j in i)))) 

Вы можете потерять map вызов, если, если вы не возражаете, имеющих list из tuples. Также я не был уверен, что вы имели в виду, вы хотели преобразовать все значения в целые числа. Вывод вашего примера не показывает этого, поэтому я предположил, что вам не нужно.

Выход:

[['4', '1', '1'], ['2', '4', '4'], ['4', '4', '3'], ['1', '1', '1'], ['3', '2', '1']] 
+0

Ваш код прекрасно решает эту проблему. Я думаю, мне нужно прочитать инструкции 'map',' zip', чтобы полностью понять ваш код. Пока я не могу понять, как работает ваш код.Спасибо – flyingmouse

+0

'map' очень просто, просто итерации по итерируемому (список, строка и т. Д.) И вызывает функцию для каждого элемента. В этом случае он вызывает 'list', и его целью является преобразование' tuples' (возвращенных 'zip') в списки. Вы можете попробовать удалить его и посмотреть, как изменяется результат. –

+0

'zip' немного сложнее, но это определенно стоит выяснить, так как это удивительно, как часто его можно использовать и сделать код намного более элегантным. Я не буду пытаться объяснять это здесь, так как [docs] (https://docs.python.org/3.5/library/functions.html#zip) делает это лучше, чем я могу. –

2

Вы слишком сложный, возможно, я тоже. Я бы перебрал более raw, затем для каждого внутреннего массива создайте вспомогательный контейнер (dict), который будет удерживать в качестве значений извлеченные массивы, как позиции клавиш в текстовых массивах.

raw = [['4 2','1 4','1 4'],['4 1','4 1','3 1'],['3','2','1']] 

res = [] 

for inner_arr in raw: 
    temp_container = {} 
    for el in inner_arr: 
     for idx, splited in enumerate(el.split()): 
      if idx in inner: 
       temp_container[idx].append(splited) 
      else: 
       temp_container[idx] = [splited] 

    res += temp_container.values() 

print(res) 

Это будет работать для любого количества элементов в «текстовом массиве».

3

Вот один вкладыш в python2 :-)

>>> from itertools import chain 
>>> list(chain(*[zip(*[x.split() for x in item]) for item in raw])) 
[('4', '1', '1'), ('2', '4', '4'), ('4', '4', '3'), ('1', '1', '1'), ('3', '2', '1')] 

Что это линия делать? Давайте разбить его (я предполагаю, что знание цепи, список понимание и т.д.):

  • Простейшие пример, и тогда мы будем строить на нем.

    >>> raw = ['4 2','1 4','1 4'] 
    >>> zip(*[x.split() for x in raw]) 
    [('4', '1', '1'), ('2', '4', '4')] 
    

    zip делает какую-то операцию транспонирования матрицы. Возьмите несколько простых примеров и попробуйте подход к бумажной ручке. Это не сложно.

  • Далее, давайте попробуем, что за весь список:

    >>> raw = [['4 2','1 4','1 4'],['4 1','4 1','3 1'],['3','2','1']] 
    >>> [zip(*[x.split() for x in item]) for item in raw] 
    [[('4', '1', '1'), ('2', '4', '4')], [('4', '4', '3'), ('1', '1', '1')], [('3', '2', '1')]] 
    
  • Довольно близко, давайте цепочку его!

    >>> raw = [['4 2','1 4','1 4'],['4 1','4 1','3 1'],['3','2','1']] 
    >>> from itertools import chain 
    >>> list(chain(*[zip(*[x.split() for x in item]) for item in raw])) 
    [('4', '1', '1'), ('2', '4', '4'), ('4', '4', '3'), ('1', '1', '1'), ('3', '2', '1')] 
    
Смежные вопросы