如何使用列表推导来制作包含列表列表的dict作为值

时间:2015-06-16 22:12:08

标签: python list for-loop

我有一个如下列表,我想使用List comprehensions将其转换为下面显示的输出。任何帮助表示赞赏。

a = [{'type': 'abc', 'values': 1},
     {'type': 'abc', 'values': 2},
     {'type': 'abc', 'values': 3},
     {'type': 'xyz', 'values': 4},
     {'type': 'xyz', 'values': 5},
     {'type': 'pqr', 'values': 6},
     {'type': 'pqr', 'values': 8},
     {'type': 'abc', 'values': 9},
     {'type': 'mno', 'values': 10},
     {'type': 'def', 'values': 11}]

这是我期待的输出。

output = {'abc': [1,2,3,9], 'xyz': [4,5], 'pqr': [6,8], 'mno': [10], 'def': [11]}

2 个答案:

答案 0 :(得分:1)

from operator import itemgetter
from itertools import groupby

a = [{'type': 'abc', 'values': 1},
     {'type': 'abc', 'values': 2},
     {'type': 'abc', 'values': 3},
     {'type': 'xyz', 'values': 4},
     {'type': 'xyz', 'values': 5},
     {'type': 'pqr', 'values': 6},
     {'type': 'pqr', 'values': 8},
     {'type': 'abc', 'values': 9},
     {'type': 'mno', 'values': 10},
     {'type': 'def', 'values': 11}]

typegetter = itemgetter('type')
valuesgetter = itemgetter('values')

groups = groupby(sorted(a, key=typegetter), key=typegetter)

print {k:list(map(valuesgetter, v)) for k, v in groups}

答案 1 :(得分:0)

a = [{'type': 'abc', 'values': 1},
     {'type': 'abc', 'values': 2},
     {'type': 'abc', 'values': 3},
     {'type': 'xyz', 'values': 4},
     {'type': 'xyz', 'values': 5},
     {'type': 'pqr', 'values': 6},
     {'type': 'pqr', 'values': 8},
     {'type': 'abc', 'values': 9},
     {'type': 'mno', 'values': 10},
     {'type': 'def', 'values': 11}]

output = {}
for item in a:
    output[item['type']] = [item['values']] if output.get(item['type'], None) is None else output[item['type']] + [item['values']]
print output