用第一个数组的项目索引条目合并两个数组?

3

假设我有:

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

I am expecting

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

正如您所见,生成的子列表位于列表 a 所指示的索引处。在Python中应该如何实现呢?


2
你需要一个Numpy的解决方案吗?虽然你打了标签,但是ab是列表,而你的最终输出c是一个列表的列表,因此它不能成为一个Numpy数组,因为它的形状不统一。 - askewchan
请检查……!@askewchan - erogol
我仍然不清楚你是如何从a和b得到c的。 - mgilson
@Erogol:a会一直按那样增加吗? - DSM
a 中的项目是否总是按排序顺序排列?它可能是 a=[1,1,1,2,2,3,3,1,2....] 吗? - ovgolovin
显示剩余3条评论
2个回答

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

作为一个新手 Python 程序员,我只是在文档中查看 defaultdict,它说“字典子类,调用工厂函数来提供缺失的值”,但愚蠢地看不懂它的意思。你能否给一些提示? - erogol
1
defaultdict 可以帮助你避免初始化字典键的麻烦。如果没有先确保 d[k] 是一个列表(例如,if k not in d: d[k] = []),那么 d[k].append(v) 将会引发 KeyError 异常。 - dirn

2

如果我理解正确,我只需要循环遍历这些术语:

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

我喜欢这里使用列表的想法,而不是像我的答案一样使用字典... +1 - mgilson
@mgilson,这对于a中的负值将无法正常工作。 - jamylak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接