Как можно нарезать список Python таким образом, чтобы столбец был перемещен в отдельный столбец элементов?
У меня есть список следующего вида:
[[0, 5.1, 3.5, 1.4, 0.2], [0, 4.9, 3.0, 1.4, 0.2], [0, 4.7, 3.2, 1.3, 0.2], [1, 4.6, 3.1, 1.5, 0.2], [1, 5.0, 3.6, 1.4, 0.2], [1, 5.4, 3.9, 1.7, 0.4], [1, 4.6, 3.4, 1.4, 0.3]]
Я хочу разрезать первый столбец и добавить его как новый элемент в каждую строку данных (поэтому в каждой нечетной позиции в списке), изменив ее на следующую форму:
- Разница между списком, последовательностью и фрагментом в Python?
- Как извлечь произвольную строку значений из массива numpy?
- Нарезка списка на Python без создания копии
- Python / Numpy - обрезать фрагмент вокруг конца массива
- Назначение среза со строкой в списке
[[5.1, 3.5, 1.4, 0.2], [0], [4.9, 3.0, 1.4, 0.2], [0], [4.7, 3.2, 1.3, 0.2], [0], [4.6, 3.1, 1.5, 0.2], [1], [5.0, 3.6, 1.4, 0.2], [1], [5.4, 3.9, 1.7, 0.4], [1], [4.6, 3.4, 1.4, 0.3], [1],]
Как я могу это сделать?
До сих пор я извлекал необходимую информацию следующими способами:
targets = [element[0] for element in dataset] features = dataset[1:]
5 Solutions collect form web for “Как можно нарезать список Python таким образом, чтобы столбец был перемещен в отдельный столбец элементов?”
Попробуй это:
from itertools import chain print list(chain(*[list((element[1:],[element[0]])) for element in a]))
Вывод:
[[5.1, 3.5, 1.4, 0.2], [0], [4.9, 3.0, 1.4, 0.2], [0], [4.7, 3.2, 1.3, 0.2], [0], [4.6, 3.1, 1.5, 0.2], [1], [5.0, 3.6, 1.4, 0.2], [1], [5.4, 3.9, 1.7, 0.4], [1], [4.6, 3.4, 1.4, 0.3], [1]]
Попробуйте индексировать, а затем получите сплющенный список – я использовал понимание списка для выравнивания.
>>>l=[[0, 5.1, 3.5, 1.4, 0.2], [0, 4.9, 3.0, 1.4, 0.2], [0, 4.7, 3.2, 1.3, 0.2], [1, 4.6, 3.1, 1.5, 0.2], [1, 5.0, 3.6, 1.4, 0.2], [1, 5.4, 3.9, 1.7, 0.4], [1, 4.6, 3.4, 1.4, 0.3]] >>>[[i[1:],[i[0]]] for i in l]#get sliced list of lists >>>[[[5.1, 3.5, 1.4, 0.2], [0]], [[4.9, 3.0, 1.4, 0.2], [0]], [[4.7, 3.2, 1.3, 0.2], [0]], [[4.6, 3.1, 1.5, 0.2], [1]], [[5.0, 3.6, 1.4, 0.2], [1]], [[5.4, 3.9, 1.7, 0.4], [1]], [[4.6, 3.4, 1.4, 0.3], [1]]] >>>d=[[i[1:],[i[0]]] for i in l] >>>[item for sublist in d for item in sublist]#flatten list d >>>[[5.1, 3.5, 1.4, 0.2], [0], [4.9, 3.0, 1.4, 0.2], [0], [4.7, 3.2, 1.3, 0.2], [0], [4.6, 3.1, 1.5, 0.2], [1], [5.0, 3.6, 1.4, 0.2], [1], [5.4, 3.9, 1.7, 0.4], [1], [4.6, 3.4, 1.4, 0.3], [1]]
Только альтернатива oneliner –
[item for sublist in [[i[1:],[i[0]]] for i in l] for item in sublist] #Here l is that list
Список понятий хорош, но может быть немного сложно отсканировать. Петли по-прежнему полезны, особенно в сочетании с extend
:
res = [] for entry in dataset: res.extend([entry[1:], entry[:1]])
Теперь:
import pprint pprint.pprint(res)
печатает:
[[5.1, 3.5, 1.4, 0.2], [0], [4.9, 3.0, 1.4, 0.2], [0], [4.7, 3.2, 1.3, 0.2], [0], [4.6, 3.1, 1.5, 0.2], [1], [5.0, 3.6, 1.4, 0.2], [1], [5.4, 3.9, 1.7, 0.4], [1], [4.6, 3.4, 1.4, 0.3], [1]]
Вырежьте каждый подсписчик и создайте новый list
с элементом для каждого фрагмента:
l = [[0, 5.1, 3.5, 1.4, 0.2], [0, 4.9, 3.0, 1.4, 0.2], [0, 4.7, 3.2, 1.3, 0.2], [1, 4.6, 3.1, 1.5, 0.2], [1, 5.0, 3.6, 1.4, 0.2], [1, 5.4, 3.9, 1.7, 0.4], [1, 4.6, 3.4, 1.4, 0.3]]
>>> print(*[item for sub in l for item in (sub[1:], [sub[0]])], sep='\n') [5.1, 3.5, 1.4, 0.2] [0] [4.9, 3.0, 1.4, 0.2] [0] [4.7, 3.2, 1.3, 0.2] [0] [4.6, 3.1, 1.5, 0.2] [1] [5.0, 3.6, 1.4, 0.2] [1] [5.4, 3.9, 1.7, 0.4] [1] [4.6, 3.4, 1.4, 0.3] [1]
Питонический подход в python 3.X с использованием распаковки итераций и itertools.chain
:
>>> from itertools import chain >>> >>> list(chain.from_iterable([[j,[i]] for i,*j in A])) [[5.1, 3.5, 1.4, 0.2], [0], [4.9, 3.0, 1.4, 0.2], [0], [4.7, 3.2, 1.3, 0.2], [0], [4.6, 3.1, 1.5, 0.2], [1], [5.0, 3.6, 1.4, 0.2], [1], [5.4, 3.9, 1.7, 0.4], [1], [4.6, 3.4, 1.4, 0.3], [1]]
- Как создать гистограмму массива с замаскированными значениями в Numpy?
- Python – Любой способ избежать нескольких if-утверждений внутри друг друга в for-loop?