[英]converting an array of pairs into a 2D array based on first column
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])
正如@thefourtheye所指出的, dict
可能是更好的容器。 如果您想要2D列表,則可以首先將值添加到中間dict
,其中key是row,value是數字列表。 然后,您可以使用列表推導生成最終結果:
>>> 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]
附言:我認為您不必在結果數據集中保留空列表-因為這浪費資源
有很多方法可以做到這一點。 這是一個相當簡單的方法:
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]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.