作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
各位,
假设我有这个列表:
l=[['-40', 'TT', '0.8', '0', '10U', '4'],
['125', 'FF', '0.8', '0', '10U', '16'],
['125', 'FF', '0.8', '0', '10U', '4' ],
['30', 'FF', '0.8', '0', '10U', '64'],
['125', 'FF', '0.3', '0', '1U', '16' ],
['125', 'FF', '0.8', '0', '1U', '4' ],
['30', 'FF', '0.8', '0', '1U', '64' ],
['125', 'FF', '0.8', '0', '4U', '16' ],
['125', 'SS', '0.8', '0', '4U', '4' ],
['125', 'FF', '0.8', '0', '4U', '64' ],
['125', 'FF', '0.8', '1', '10U', '4' ],
['125', 'FF', '0.8', '1', '1U', '4' ],
['125', 'SS', '0.8', '1', '4U', '4' ],
['125', 'FF', '0.9', '16', '10U', '64'],
['125', 'FF', '0.8', '16', '1U', '64'],
['125', 'FF', '0.8', '16', '4U', '64'],
['125', 'FF', '0.8', '2', '10U', '4' ],
['125', 'FF', '0.8', '2', '1U', '4' ]
]
您可能会注意到,它是一个大小为 (18x6) 的矩阵,其中元素是仅在某些列中表示 float 的字符串。
我可以很高兴地通过应用将其排序在第三列
newL = sorted(l, key = lambda t: float(t[2]))
newL 内容将是(我从现在开始禁止 [,]):
'125', 'FF', '0.3', '0', '1U', '16'
'-40', 'TT', '0.8', '0', '10U', '4'
'125', 'FF', '0.8', '0', '10U', '16'
'125', 'FF', '0.8', '0', '10U', '4'
'30', 'FF', '0.8', '0', '10U', '64'
'125', 'FF', '0.8', '0', '1U', '4'
'30', 'FF', '0.8', '0', '1U', '64'
'125', 'FF', '0.8', '0', '4U', '16'
'125', 'SS', '0.8', '0', '4U', '4'
'125', 'FF', '0.8', '0', '4U', '64'
'125', 'FF', '0.8', '1', '10U', '4'
'125', 'FF', '0.8', '1', '1U', '4'
'125', 'SS', '0.8', '1', '4U', '4'
'125', 'FF', '0.8', '16', '1U', '64'
'125', 'FF', '0.8', '16', '4U', '64'
'125', 'FF', '0.8', '2', '10U', '4'
'125', 'FF', '0.8', '2', '1U', '4'
'125', 'FF', '0.9', '16', '10U', '64'
在 Matlab 表示法中,我将使用 newL(:,3) 来访问第三列。这会给我一个包含
的(列)向量'0.3'
'0.8'
'0.8'
'0.8'
'0.8'
etc.
在Python中,我可以想象通过迭代构建它来提取这个向量,以从任何列表中提取第三个元素:
col = []
for line in newL:
col.append(line[2])
结果是:
['0.3', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.9']
但是......有没有一种更Pythonic的方法来从newL获取第三列?
如果您有任何绝妙的想法,我可以更改数据结构(也许列表列表不是处理此问题的最佳方法)。
最佳答案
是的。例如,您可以在 operator
包的 itemgetter
上使用 map(..)
:
from operator import itemgetter
result = map(itemgetter(2), newL)
或者没有内置函数,您可以使用列表理解:
result = [row[2] for row in newL]
两者产量:
>>> map(itemgetter(2), newL)
['0.3', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.9']
>>> [row[2] for row in newL]
['0.3', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.9']
在 python-2.7 , map
构造一个列表,在 python-3.x然而,map
是一个惰性可迭代对象。为了具体化列表,您需要用 list(..)
将其包围。
您还可以使用numpy并执行高级索引:
import numpy as np
a = np.array(newL)
result = a[:,2]
结果是一个 numpy 数组:
>>> a[:,2]
array(['0.3', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8',
'0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.8', '0.9'],
dtype='<U3')
但这仅适用于列表的矩形列表。
关于python - 如何从 'column' 快速获取 'matrix' ? (不一定是数字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46558909/
我是一名优秀的程序员,十分优秀!