我有一个数据列表,它有两个值:
a 12
a 11
a 5
a 12
a 11
我想使用字典,所以我最终可以得到每个键的值列表。第1列可能有不同的条目,如'b'
,因此我可以根据第1列作为键排列数据,而第2列是每个键的数据
[a:12,11,5]
我如何实现这一目标?根据我的阅读,如果2个值具有相同的键,则最后一个键覆盖前一个键,因此字典中只有一个键。
d={}
for line in results:
templist=line.split(' ')
thekey=templist[0]
thevalue=templist[1]
if thevalue in d:
d[thekey].append(thevalue)
else:
d[thekey]=[thevalue]
我是否以错误的方式解决问题?
答案 0 :(得分:6)
Python dicts只能为一个键设置一个值,因此您无法以您想要的方式分配多个值。
相反,将多个值存储在与键对应的列表中,以使列表成为与键对应的一个值:
d = {}
d["a"] = []
d["a"].append(1)
d["a"].append(2)
>>> print d
{'a': [1, 2]}
您可以使用defaultdict
来简化此操作,如果密钥不存在,则会初始化密钥,如下所示:
from collections import defaultdict
d = defaultdict(list)
d["a"].append(1)
d["a"].append(2)
>>> print d
defaultdict(<type 'list'>, {'a': [1, 2]})
如果您不想重复键的值,可以使用set而不是list。但要注意set
是无序的。
from collections import defaultdict
d = defaultdict(set)
d["a"].add(1)
d["a"].add(2)
d["a"].add(1)
>>> print d
defaultdict(<type 'set'>, {'a': set([1, 2])})
如果您需要维护订单,请使用在运行时排序,或使用列表 使用if子句检查值
from collections import defaultdict
d = defaultdict(list)
for item in (1, 2, 1, 2, 3, 4, 1, 2):
if item not in d["a"]:
d["a"].append(item)
>>> print d
defaultdict(<type 'list'>, {'a': [1, 2, 3, 4]})