簡體   English   中英

根據第一列將成對的數組轉換為2D數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM