如何用优雅的方式在python中使用list中的多个值构建索引映射?

时间:2017-12-08 04:04:29

标签: python dictionary functional-programming

我想从列表中在python中构建一个dict,dict的键是第一列,map的值是第二列。有没有优雅的方法来实现这个?

例如, A= [[1,2], [1,3], [2,3]] 结果是 M={1:[2,3],2:[3]} 我自己的方式是 for row in A: if row[0] not in M: M[row[0]] = [] M[row[0]].append(row[1]) 有没有更好的解决方案?功能编程方法是首选。

2 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是使用defaultdict

from collections import defaultdict

A= [[1,2], [1,3], [2,3]]
d = defaultdict(list)
for k, v in A:
    d[k].append(v)

答案 1 :(得分:2)

您可以使用setdefault

A= [[1,2], [1,3], [2,3]]
M = {}                                                                 
for k,v in A:
    M.setdefault(k, []).append(v)

M 
# {1: [2, 3], 2: [3]}

如果必须有效(免责声明:浪费,不推荐):

import operator, itertools
grps = itertools.groupby(sorted(A, key=operator.itemgetter(0)), operator.itemgetter(0))
M = {k: list(map(operator.itemgetter(1), v)) for k, v in grps}
M
# {1: [2, 3], 2: [3]}