Разбить многомерный список python и объединить с другим списком python - PullRequest
0 голосов
/ 03 мая 2020

Это списки:

[(3.8, 101.39), (1.597, 103.613), (4.7, 100.83), (4.804, 101.52)]
[(3.845, 101.396), (1.56, 103.613), (4.71, 100.9), (4.454, 101.161)]
[(3.847, 101.3), (1.59, 103.63), (4.76, 100.89), (4.45, 101.16)]

Как их можно разделить, чтобы они стали такими:

[(3.8, 101.39), (3.845, 101.396), (3.847, 101.3)]
[(1.597, 103.613), (1.56, 103.613), (1.59, 103.63)]
[(4.7, 100.83), (4.71, 100.9), (4.76, 100.89)]
[(4.804, 101.52), (4.454, 101.161), (4.45, 101.16)]

И в итоге способны произвести:

3.8 101.39 3.845 101.396 3.847 101.3
1.597 103.613 1.56 103.613 1.59 103.63
4.7 100.83 4.71, 100.9 4.76 100.89
4.804 101.52 4.454 101.161 4.45 101.16

Мой текущий код:

a, b, c = map(list, zip(*abc))
d, e = map(list, zip(*a))

Производим этот результат:

[3.8462193, 1.597, 4.7, 4.804 ]
[101.39, 103.613, 100.83, 101.52]

Что не так ...

Ответы [ 3 ]

1 голос
/ 03 мая 2020

То, что вы описываете, представляет собой Matrix Transpose , вы можете достичь этого с помощью понимания списка:

abc = [
        [(3.8, 101.39), (1.597, 103.613), (4.7, 100.83), (4.804, 101.52)],
        [(3.845, 101.396), (1.56, 103.613), (4.71, 100.9), (4.454, 101.161)],
        [(3.847, 101.3), (1.59, 103.63), (4.76, 100.89), (4.45, 101.16)] 
      ]
transpose = [[row[i] for row in abc] for i in range(len(abc[0]))]

И чтобы распечатать все это линейным образом, вы можете выполнить итерацию все списки и вставьте новую строку, где approriate:

for line in transpose:
    for row in line:
        print(row[0], row[1], end="")
    print()

И вы получите ожидаемый результат:

3.8 101.393.845 101.3963.847 101.3
1.597 103.6131.56 103.6131.59 103.63
4.7 100.834.71 100.94.76 100.89
4.804 101.524.454 101.1614.45 101.16
1 голос
/ 03 мая 2020

Если я правильно вас понимаю, все, что вам нужно было сделать, это использовать первый map(list, zip(*abc)), который должен правильно разделить ввод, чтобы получить желаемый результат. Хотя я думаю, что в вашем коде есть ошибка, поскольку эта строка должна выводить 4 переменные, а не 3. Таким образом, это должно быть просто:

abc = [
        [(3.8, 101.39), (1.597, 103.613), (4.7, 100.83), (4.804, 101.52)],
        [(3.845, 101.396), (1.56, 103.613), (4.71, 100.9), (4.454, 101.161)],
        [(3.847, 101.3), (1.59, 103.63), (4.76, 100.89), (4.45, 101.16)] 
      ]

a, b, c, d= map(list, zip(*abc))

print(a) # [(3.8, 101.39), (3.845, 101.396), (3.847, 101.3)]
print(b) # [(1.597, 103.613), (1.56, 103.613), (1.59, 103.63)]
print(c) # [(4.7, 100.83), (4.71, 100.9), (4.76, 100.89)]
print(d) # [(4.804, 101.52), (4.454, 101.161), (4.45, 101.16)]

Кроме того, вы никогда не определяли, какая переменная de была, поэтому я не конечно, я точно знаю, чего вы пытаетесь достичь, но я надеюсь, что именно это вы и пытались сделать.

0 голосов
/ 03 мая 2020

Вот одно решение на основе numpy, если вы хотите попробовать.

Использование:

import numpy as np

abc = [[(3.8, 101.39), (1.597, 103.613), (4.7, 100.83), (4.804, 101.52)],
       [(3.845, 101.396), (1.56, 103.613), (4.71, 100.9), (4.454, 101.161)],
       [(3.847, 101.3), (1.59, 103.63), (4.76, 100.89), (4.45, 101.16)]]

arr = np.array(abc)
a, b, c, d = map(lambda x: x.flatten().tolist(), np.hsplit(arr, 4))

Результат:

[3.8, 101.39, 3.845, 101.396, 3.847, 101.3] # list a
[1.597, 103.613, 1.56, 103.613, 1.59, 103.63] # list b
[4.7, 100.83, 4.71, 100.9, 4.76, 100.89] # list c
[4.804, 101.52, 4.454, 101.161, 4.45, 101.16] # list d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...