根据元组列表中的某些键组合常用值

时间:2014-07-04 01:08:06

标签: python dictionary

e.g

data = [ (item1, ('1-jan' ,45)) , (item2, ('21-jan',65)), (item1, ('21-jan',48))]

我喜欢这样的东西:

result = [ (item1, [('1-jan' ,45),('21-jan',48)]), (item2, [('21-jan',65)])]

确切地说,我需要最终结果

result = { item1: ('1-jan':45,'21-jan':48)), item2: ('21-jan':65)]

3 个答案:

答案 0 :(得分:3)

您可以使用dict.setdefault()在词典中轻松创建分组:

>>> data = [ ('item1', ('1-jan' ,45)) , ('item2', ('21-jan',65)), ('item1', ('21-jan',48))]
>>> result = {}
>>> for k, v in data:
        result.setdefault(k, []).append(v)

>>> result
{'item2': [('21-jan', 65)], 'item1': [('1-jan', 45), ('21-jan', 48)]}

您也可以使用collections.defaultdict来达到同样目的。

答案 1 :(得分:1)

如果@ Raymond setdefault()不适合您,请尝试使用defaultdict(list)对象:

data = [ ("item1", ('1-jan' ,45)) , ("item2", ('21-jan',65)), ("item1", ('21-jan',48))]

from collections import defaultdict
out = defaultdict(list)
for key,value in data:
    out[key].append(value)

print out

输出

defaultdict(<type 'list'>, {'item2': [('21-jan', 65)], 'item1': [('1-jan', 45), ('21-jan', 48)]})

答案 2 :(得分:-1)

这并不像迭代每个值并将其添加到字典那么简单。您必须检查以确保密钥(item1,item2)不在字典中。如果是,则必须将值附加到现有密钥。

你走了:

data = [ ('item1', ('1-jan' ,45)) , ('item2', ('21-jan',65)), ('item1', ('21-jan',48))]

dataDict = {}

for i in range(len(data)):
    if data[i][0] not in dataDict:
        dataDict[data[i][0]] = data[i][1]
    else:
        dataDict[data[i][0]] += data[i][1]

正如上述用户所评论的那样,您可以使用默认词典来简化生活。