2013-05-10 75 views
3

假設我有通過使用第一個數組項目對條目進行索引來合併兩個數組?

a = [1,2,1,3,2,2] 
b = [4,7,9,5,6,11] 

我期待

c = [[4,9],[7,6,11],[5]] 

因爲你可能會看到生成的子列表是在由列表a指出的指數。我們將如何在Python中做什麼?

+0

你將如何在Python做? – 2013-05-10 13:31:54

+2

你想在Numpy的解決方案?你已經標記了標籤,但'a'和'b'是列表,你的最終輸出'c'是一個列表列表,因爲它不是一個統一的形狀,所以它不能是一個numpy數組。 – askewchan 2013-05-10 13:33:27

+0

檢查.......! @askewchan – erogol 2013-05-10 13:34:21

回答

2

IIUC,我只是在條件循環:

def combine(a,b): 
    c = [[] for _ in range(max(a))] 
    for i, elem in zip(a, b): 
     c[i-1].append(elem) 
    return c 

這給

>>> a = [1, 1, 1, 2, 2, 3] 
>>> b = [4, 7, 9, 5, 6, 11] 
>>> combine(a,b) 
[[4, 7, 9], [5, 6], [11]] 
>>> a = [1,2,1,3,2,2] 
>>> b = [4,7,9,5,6,11] 
>>> combine(a,b) 
[[4, 9], [7, 6, 11], [5]] 
+0

我喜歡這裏的列表的想法,而不是像我的答案使用字典...... +1 – mgilson 2013-05-10 13:43:44

+0

@mgilson這將無法正常工作負值'a'然而 – jamylak 2013-05-10 13:44:17

5

你可以使用一個defaultdict

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> a = [1,1,1,2,2,3] 
>>> b = [4,7,9,5,6,11] 
>>> for k,v in zip(a,b): 
...  d[k].append(v) 
... 
>>>[x[1] for x in sorted(d.items())] 
[[4, 7, 9], [5, 6], [11]] 
+0

我只是看着doc,因爲我是一個新手python編碼器,它說「dict調用工廠函數以提供缺失值的子類」,對於defaultdict而言,愚蠢地看不出它的意思。你能提供一些線索嗎? – erogol 2013-05-10 13:54:11

+1

'defaultdict'不需要初始化字典的密鑰。 'd [k] .append(v)''會在不首先確定'd [k]'是一個列表(例如'如果k不在d:d [k] = []')中的情況下會引發'KeyError'。 – dirn 2013-05-10 14:00:28

相關問題