首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为字典中的一个键追加多个值

为字典中的一个键追加多个值
EN

Stack Overflow用户
提问于 2010-07-08 05:50:48
回答 6查看 691.2K关注 0票数 161

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

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

代码语言:javascript
复制
2010  
2  
2009  
4  
1989  
8  
2009  
7  

我想做的是用年份作为关键字,用那些个位数作为值来填充字典。但是,如果我有两次列出2009,我希望将第二个值附加到该字典中的值列表中,因此我希望:

代码语言:javascript
复制
2010: 2  
2009: 4, 7  
1989: 8  

现在,我有以下几点:

代码语言:javascript
复制
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  
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-08 06:00:53

如果我可以重新表述您的问题,您需要的是一个以年份为关键字的字典,以及一个包含与该年关联的值列表的每个年份的数组,对吧?我是这样做的:

代码语言:javascript
复制
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中,您最终应该得到一个如下所示的字典:

代码语言:javascript
复制
{
    "2010": [2],
    "2009": [4,7],
    "1989": [8]
}

通常,创建“并行数组”是一种糟糕的编程实践,在这种情况下,项通过具有相同的索引而不是包含它们的容器的适当子项来隐式地相互关联。

票数 229
EN

Stack Overflow用户

发布于 2010-07-08 05:53:57

最好使用collections.defaultdict (在Python2.5中添加)。这允许您指定缺失键的默认对象类型(例如list)。

因此,不是先创建一个不存在的键,然后附加到键的值,而是去掉中间人,直接附加到不存在的键,以获得所需的结果。

使用您的数据的一个快速示例:

代码语言:javascript
复制
>>> 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]})

这样,您就不必担心是否看到过与年份相关的数字。您只需添加并忘记,因为您知道丢失的键始终是一个列表。如果一个键已经存在,那么它将被附加到后面。

票数 117
EN

Stack Overflow用户

发布于 2010-07-08 06:00:17

您可以使用setdefault

代码语言:javascript
复制
for line in list:  
    d.setdefault(year, []).append(value)

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

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3199171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档