所以我有以下格式的列表:
[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]}
如何将其添加到分配给密钥的列表中而不是替换它?
编辑:想要澄清我的数据是从该格式的文本文件导入的,具有新的行间距
答案 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']}