在Python字典中为一个键添加多个值

我是python的新手,我有一个年份和值的列表,每年。 我想要做的是检查年份是否已经存在于一个字典中,如果存在,请将该值附加到特定键的值列表中。

例如,我有一个年份的列表,每年有一个值:

2010 2 2009 4 1989 8 2009 7 

我想要做的是填充一个字典,其中年份为键,单个数字为值。 但是,如果我已经2009年列出两次,我想附加第二个值到该字典中的值列表,所以我想:

 2010: 2 2009: 4, 7 1989: 8 

现在我有以下几点:

 d = dict() years = [] (get 2 column list of years and values) for line in list: year = line[0] value = line[1] for line in list: if year in d.keys(): d[value].append(value) else: d[value] = value d[year] = year 

如果我可以重新解释一下你的问题,你想要的是一个以年为关键字的字典,每年的数组包含与当年相关的值列表,对不对? 以下是我该怎么做:

 years_dict = dict() for line in list: if line[0] in years_dict: # append the new number to the existing array at this slot years_dict[line[0]].append(line[1]) else: # create a new array in this slot years_dict[line[0]] = [line[1]] 

years_dict中应该包含的是一个字典,如下所示:

 { "2010": [2], "2009": [4,7], "1989": [8] } 

一般来说,创build“并行数组”的编程习惯很差,其中项目通过具有相同索引而隐式地彼此关联,而不是包含它们的容器的适当子项。

你最好使用collections.defaultdict (在Python 2.5中添加)。 这使您可以指定缺less密钥的默认对象types(如list )。

所以,如果不是先创build一个关键字,然后追加键值,那么就不用创build一个关键字,而是直接将中间关键字添加到不存在的关键字上,以获得所需的结果。

一个使用你的数据的简单例子:

 >>> from collections import defaultdict >>> data = [(2010, 2), (2009, 4), (1989, 8), (2009, 7)] >>> d = defaultdict(list) >>> d defaultdict(<type 'list'>, {}) >>> for year, month in data: ... d[year].append(month) ... >>> d defaultdict(<type 'list'>, {2009: [4, 7], 2010: [2], 1989: [8]}) 

这样你就不用担心你是否看到过与一年相关的数字。 你只是追加和忘记,知道一个失踪的钥匙将永远是一个列表。 如果一个键已经存在,那么它将被附加到。

你可以使用setdefault

 for line in list: d.setdefault(year, []).append(value) 

这是因为setdefault返回列表并将其设置在字典上,并且因为列表是可变的,所以附加到setdefault返回的版本与将其附加到字典本身内的版本相同。 如果那有意义的话。

 d = {} # import list of year,value pairs for year,value in mylist: try: d[year].append(value) except KeyError: d[year] = [value] 

Python的方式 – 获得宽恕要比获得许可更容易!

下面是使用not in操作符的另一种方法:

 # define an empty dict years_dict = dict() for line in list: # here define what key is, for example, key = line[0] # check if key is already present in dict if key not in years_dict: years_dict[key] = [] # append some value years_dict[key].append(some.value) 

如果将这些值放入元组列表中会更容易。 要做到这一点,你可以使用列表切片和zipfunction。

 data_in = [2010,2,2009,4,1989,8,2009,7] data_pairs = zip(data_in[::2],data_in[1::2]) 

Zip使用任意数量的列表,在本例中是data_in的偶数和奇数条目,并将它们放在一个元组中。

现在我们可以使用setdefault方法。

 data_dict = {} for x in data_pairs: data_dict.setdefault(x[0],[]).append(x[1]) 

setdefault采用一个键和一个默认值,并返回相关的值,或者如果没有当前值,则返回默认值。 在这种情况下,我们将得到一个空的或者填充的列表,然后我们将当前值附加到。