基于第一列将对数组转换为2D数组

时间:2016-08-06 06:09:07

标签: python list multidimensional-array indexing

在Python中有一种(最好是优雅的)方式来获取诸如

之类的对
[[3,350],[4,800],[0,150],[0,200],[4,750]]

类似

[
  [150,200],
  [],
  [],
  [350],
  [800,750]
]

换句话说,什么是将每对中的第二个数字放入数组的好方法,其行索引由该对中的第一个数字决定?

4 个答案:

答案 0 :(得分:1)

尝试查看列表推导,它们提供了一种创建列表的单行方式。如果你不知道它们是什么,这是一个非常好的指南,可以帮助你入门here。另外,请查看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])

答案 1 :(得分:0)

正如@thefourtheye所说,dict可能是更好的容器。如果您想要2D列表,您可以先将值添加到中间dict,其中键是行,值是数字列表。然后你可以使用list comprehension来生成最终结果:

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

答案 2 :(得分:0)

我会使用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我认为您不必在结果数据集中保留空列表 - 因为它浪费资源

答案 3 :(得分:0)

有很多方法可以做到这一点。这是一个相当简单的方法:

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