在不替换旧值的情况下附加到字典中的列表?

时间:2018-01-18 12:19:22

标签: python

所以我有以下格式的列表:

[2.7, 2018, Canada]
[3.4, 2018, New York, USA]
[17.49, 2017, Canada]

这种模式会持续一段时间,各国都在重复。

我想把它放在以下格式中:

{Canada: [2018, 2.7, 2017, 17.49], USA: [2018, 3.4]}

这是我得到的代码 (data_lists =上面的列表)

empty_dic = {}
empty_dic[data_lists[-1]] = []
if data_lists[-1] in empty_dic:
    empty_dic[data_lists[-1]].append([data_lists[1], data_lists[2])

print(empty_dic)

但是,追加功能不能像我想要的那样工作。它会覆盖上一个列表中的信息。给我一个输出,如:

{Canada: [2018, 17.49], USA: [2018, 3.4]}

如何将其添加到分配给密钥的列表中而不是替换它?

编辑:想要澄清我的数据是从该格式的文本文件导入的,具有新的行间距

3 个答案:

答案 0 :(得分:2)

您可以使用collections.defaultdict

from collections import defaultdict
data = [[2.7, 2018, "Canada"], [3.4, 2018, "New York", "USA"], [17.49, 2017, "Canada"]]
d = defaultdict(list)
for sublist in data:
    d[sublist[-1]] += sublist[0:2]

输出

>>> d
defaultdict(<class 'list'>, {'USA': [3.4, 2018], 'Canada': [2.7, 2018, 17.49, 2017]})

答案 1 :(得分:1)

您可以使用itertools.groupby根据公用密钥对列表进行分组,然后将dict构建为预期输出

>>> import itertools
>>> data = [[2.7, 2018, "Canada"], [3.4, 2018, "New York", "USA"], [17.49, 2017, "Canada"]]
>>> d = dict((k,list(g))for k,g in itertools.groupby(sorted(data,key=lambda x: x[-1]),key=lambda x: x[-1]))

此操作将基于公共密钥对列表进行分组。我们已将键指定为列表的最后一个元素

>>> d
>>> {'Canada': [[2.7, 2018, 'Canada'], [17.49, 2017, 'Canada']], 'New York': [[3.4, 2018, 'New York', 'USA']]}

>>> final_dict = dict((k,list(filter(lambda x: x!=k, list(itertools.chain(*v))))) for k,v in d.items())

这将为您提供所需的输出

>>> final_dict
>>> {'Canada': [2.7, 2018, 17.49, 2017], 'New York': [3.4, 2018, 'USA']}

答案 2 :(得分:0)

A = [[2.7, 2018, "Canada"], [3.4, 2018, "New York", "USA"], [17.49, 2017, "Canada"]]

d = {}
for i in A:
    if i[-1] not in d: #Check if key already in dict
        d[i[-1]] = []
    d[i[-1]] += i[:len(i)-1]   #Exclude last element

print d

<强>结果:

{'Canada': [2.7, 2018, 17.49, 2017], 'USA': [3.4, 2018, 'New York']}