在字典中为一个键存储多个值

4

我有一个数据列表,其中包含两个值:

a    12
a    11
a    5
a    12
a    11

我想使用字典,这样我就可以获得每个键的值列表。列1可能有不同的条目,比如'b',因此我可以基于列1作为键来安排数据,而列2是每个键的数据。
[a:12,11,5]

我该如何实现这个?根据我的阅读,如果两个值具有相同的键,则最后一个值将覆盖前一个值,因此字典中只有一个键。

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]

我使用的方法是否有误?


1
“if thevalue in d:”实际上是在搜索字典的键。我认为你想使用“if thekey in d:”。 - Jthorpe
好的,我正在按值搜索,而不是按键搜索;键可能相同,但通常是相同的,所以我只检查该键的列表中是否不存在该值。 - user393267
1个回答

9

Python字典每个键只能对应一个值,因此您不能尝试以这种方式分配多个值。

相反,将多个值存储在与键对应的列表中,使列表成为与键对应的唯一值:

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是无序的。
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])})

如果您需要维护顺序,请在运行时使用sorted,或者使用带有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]})

非常感谢,这似乎很简单。一个问题:我需要运行一个检查来确保我不会在字典中保存已经存在于该键的值。那我仍然运行[if thevalue in d:]吗? - user393267
3
在这种情况下,你可以将值存储在一个“set”中,而不是一个“list”,这将自动确保任何给定的键只有一个值的副本。但是,“set”是无序的,因此无法进行索引。 - PM 2Ring
我明白了,我不需要对值或键进行排序,我只需要确保为每个特定的键保存所有值,并且在列表中不会有重复项;因为我稍后将解析该列表以进行进一步的处理。 - user393267

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接