Python中有没有一种(最好是优雅的(方法来获取一组对,比如
[[3,350],[4,800],[0,150],[0,200],[4,750]]
转化为类似的东西
[
[150,200],
[],
[],
[350],
[800,750]
]
换句话说,将每对中的第二个数字放入数组的好方法是什么?数组的行索引由对中的第一个数字决定?
试着看看列表理解,它们提供了一种创建列表的单行方式。如果你不知道它们是什么,这是一个很好的指南,让你从这里开始。另外,看看tuple
的,因为它们更适合成对的值,而不是列表。注意元组是不可变的,所以一旦创建了元组就不能进行更改
使用元组的列表看起来像这个
foo = [(3,350),(4,800),(0,200),(4,750)]
据我所知,Python列表没有预定义的大小,而是随着更改而增长和收缩。因此,您要做的是找到列表中最大的索引值,即foo = [x[0] for x in list_of_pairs]
将访问主列表中每个列表的第一个索引,即名为list_of_pairs
的索引。请注意,此策略也适用于基于tuple
的列表。
下面应该做你想要的
list_of_pairs = [[3,350],[4,800],[0,200],[4,750]]
indexes = {x[0] for x in list_of_pairs}
new_list = []
for i in indexes:
new_list.append([x[1] for x in list_of_pairs if x[0] == i])
正如@theforthey所指出的,dict
可能是更好的容器。如果您想要2D列表,您可以首先将值添加到中间dict
中,其中键是行,值是数字列表。然后你可以使用列表理解来生成最终结果:
>>> l = [[3,350],[4,800],[0,150],[0,200],[4,750]]
>>> d = {}
>>> for row, num in l:
... d.setdefault(row, []).append(num)
...
>>> [d.get(i, []) for i in range(max(d.keys()) + 1)]
[[150, 200], [], [], [350], [800, 750]]
我会使用pandas模块来完成这项任务:
In [186]: a = np.array([[3,350],[4,800],[0,150],[0,200],[4,750]])
In [187]: res = pd.DataFrame(a).groupby(0)[1].apply(list).to_frame('val').rename_axis('idx')
In [188]: res
Out[188]:
val
idx
0 [150, 200]
3 [350]
4 [800, 750]
现在您有了一个索引数据集,可以通过以下方式使用它:
In [190]: res.ix[0, 'val']
Out[190]: [150, 200]
In [191]: res.ix[0, 'val'][1]
Out[191]: 200
In [192]: res.ix[4, 'val']
Out[192]: [800, 750]
PS我认为你不必在结果数据集中保留空列表,因为这是对资源的浪费
有很多方法可以做到这一点。这里有一个相当直接的例子:
a = [[3, 350], [4, 800], [0, 150], [0, 200], [4, 750]]
rows, values = zip(*a)
b = [[] for _ in range(max(rows)+1)] # initialize 2D output
for i, row in enumerate(rows):
b[row].append(values[i])
print(b) # -> [[150, 200], [], [], [350], [800, 750]]