问题 如何切割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]]

我想切出第一列并将其作为新元素添加到每行数据(因此在列表中的每个奇数位置),将其更改为以下形式:

[[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:]

9146
2017-12-05 06:17


起源

不太重复,但请看 这里。 - TigerhawkT3


答案:


尝试这个:

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]]

2
2017-12-05 06:33



您可以使用而不是解压缩 list(itertools.chain.from_iterable([list((element[1:],[element[0]])) for element in l])) - SIslam


尝试索引,然后得到扁平列表 - 我使用列表理解进行展平。

>>>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

5
2017-12-05 06:20



这很接近,但你需要压扁结果。 - DSM
那解释怎么样? - TigerhawkT3


列表理解很好但可能有点难以扫描。循环仍然有用,特别是与之结合使用时 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]]

4
2017-12-05 07:16



最好的答案只是因为你没有使用列表理解... [r.extend((el[1:],el[:1])) for r in [[]] for el in dataset]; print r - gboffi
@gboffi很好的尝试。但它在Python 3中不起作用,因为 r 在列表理解之后没有定义。你需要两行 res = []; [res.extend([entry[1:], entry[:1]]) for entry in dataset]。具有副作用的列表理解并不是很好。通常,您需要有用的返回值。 - Mike Müller
好吧,我已经从困难的方式了解了P2列表理解中的副作用......我个人对新行为感到非常高兴,我评论中的代码只是一个笑话。 - gboffi
也许是代码示例版本的候选者 pypi.python.org/pypi/pyjokes )。 - Mike Müller


切片每个子列表并创建一个新的子列表 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]

2
2017-12-05 06:22



使用列表理解中的打印使得扫描变得相当困难。使用两条线并将打印分开将更容易在眼睛上。此外,你可以使用 pprint。 - Mike Müller


python 3.X中的Pythonic方法,使用解包迭代和 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]]

1
2017-12-05 07:54



这只是Python3。该 *j 解包在Python 2中不起作用。 - Mike Müller
@MikeMüller的确,我错过了提及,谢​​谢。 - Kasrâmvd