我是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
发布于 2010-07-08 06:00:53
如果我可以重新表述您的问题,您需要的是一个以年份为关键字的字典,以及一个包含与该年关联的值列表的每个年份的数组,对吧?我是这样做的:
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]
}
通常,创建“并行数组”是一种糟糕的编程实践,在这种情况下,项通过具有相同的索引而不是包含它们的容器的适当子项来隐式地相互关联。
发布于 2010-07-08 05:53:57
最好使用collections.defaultdict
(在Python2.5中添加)。这允许您指定缺失键的默认对象类型(例如list
)。
因此,不是先创建一个不存在的键,然后附加到键的值,而是去掉中间人,直接附加到不存在的键,以获得所需的结果。
使用您的数据的一个快速示例:
>>> 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]})
这样,您就不必担心是否看到过与年份相关的数字。您只需添加并忘记,因为您知道丢失的键始终是一个列表。如果一个键已经存在,那么它将被附加到后面。
发布于 2010-07-08 06:00:17
您可以使用setdefault
。
for line in list:
d.setdefault(year, []).append(value)
这是可行的,因为setdefault返回列表并将其设置在字典中,而且因为列表是可变的,所以附加到setdefault返回的版本与将其附加到字典本身的版本中是相同的。如果这有任何意义的话。
https://stackoverflow.com/questions/3199171
复制相似问题