Преобразование списка списков в трехмерный список с использованием понимания списка - PullRequest
0 голосов
/ 18 июня 2020

Итак, у меня есть список списков (я не хочу называть 2D-список, потому что он имеет разные размеры)

mylist = [[0, 4, 3, 2, 1], [0, 3, 4, 1], [0, 4, 1], [0, 2, 1], [0, 3, 4, 1], [0,1]] #len(mylist) = 6

И я хочу преобразовать этот список в «3D-список» каждый третий элемент, чтобы я получил

newlist = [[[0, 4, 3, 2, 1], [0, 3, 4, 1], [0, 4, 1]], [[0, 2, 1], [0, 3, 4, 1], [0, 1]]]

Может быть, это довольно простой c вопрос, и я думаю, что могу сделать это, используя Numpy, но я пытаюсь изучить понимание списка и каждый пример, который я До сих пор видно, что в каждом списке одинаковое количество элементов, заранее спасибо и извините, если это простой вопрос.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

каждый пример, который я видел до сих пор, имеет одинаковое количество элементов в каждом списке,

Это потому, что многие существующие примеры, такие, что он берет элемент из исходного списка, преобразует он (сопоставьте его) и создает новый преобразованный список. У вас также может быть условное понимание списка, которое будет удалять элементы из целевого списка, если не выполняется определенное условие для обрабатываемого элемента. Возможно, вы захотите увидеть мой другой ответ о понимании списка


Следует отметить один момент: «размер» или форма вашего списка не меняется при вводе через простой понимание списка. По крайней мере, вам может потребоваться вложить его. Что-то вроде [[y for y in x] x for x in z] Но если вы настаиваете на его использовании, вам придется исследовать, используя:

  • Chunking (это довольно стандартно; просто введите здесь «chunking python list»)
  • Или, чуть более опасный вариант: заархивировать 3 ссылки на один и тот же итератор вместе. ;)

Отвечу на ваш вопрос: не вижу необходимости в понимании списка. Просто добавьте старый простой слайд и список:

newlist = [mylist[:3]] + [mylist[3:]]
print(newlist)
# [[[0, 4, 3, 2, 1], [0, 3, 4, 1], [0, 4, 1]], [[0, 2, 1], [0, 3, 4, 1], [0, 1]]]

.. обратите внимание, что приведенное выше не является общим решением по любому поводу. Скорее всего, вам понадобится один из двух пунктов выше.


Вот несколько более общее решение. Если вы изучаете понимание списка, вам может потребоваться некоторое время, чтобы полностью понять, почему это работает:)

>>> items = list(range(20))
>>> it = iter(items)
>>> items_in_one_chunk = 4
>>> iters = [it] * items_in_one_chunk
>>> [list(x) for x in zip(*iters)]
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]]
1 голос
/ 18 июня 2020

Вы можете использовать функцию slice () для разделения вашего списка на каждые 3 элемента. Посмотрите здесь , чтобы понять его лог c. Также это обсуждение похоже на то, чего вы хотите достичь.

...