【问题标题】:How can a Python list be sliced such that a column is moved to being a separate element column?如何对 Python 列表进行切片,以便将列移动为单独的元素列?
【发布时间】:2016-03-10 04:32:38
【问题描述】:

我有一个如下形式的列表:

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

【问题讨论】:

  • 不是完全重复,但请参阅here

标签: python list slice


【解决方案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]]

单线替代方案-

[item for sublist in [[i[1:],[i[0]]] for i in l] for item in sublist] #Here l is that list

【讨论】:

  • 这很接近,但您需要将结果展平。
  • 解释一下如何?
【解决方案2】:

列表推导很好,但可能有点难以扫描。循环仍然有用,尤其是与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]]

【讨论】:

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

试试这个:

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

【讨论】:

  • 你可以使用list(itertools.chain.from_iterable([list((element[1:],[element[0]])) for element in l]))而不是解压
【解决方案4】:

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

【讨论】:

  • 在列表理解中使用打印会使扫描变得相当困难。使用两条线并将打印分开在眼睛上会更容易。另外,您可以使用pprint
【解决方案5】:

python 3.X 中使用解包迭代和itertools.chain 的 Pythonic 方法:

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

【讨论】:

  • 这仅适用于 Python3。 *j 解包在 Python 2 中不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多