在字典中为一个键附加多个值

ano*_*non 129 python dictionary key-value

我是python的新手,我每年都有一份年份和价值清单.我想要做的是检查字典中是否已存在年份,如果存在,则将值附加到特定键的值列表中.

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

2010  
2  
2009  
4  
1989  
8  
2009  
7  
Run Code Online (Sandbox Code Playgroud)

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

2010: 2  
2009: 4, 7  
1989: 8  
Run Code Online (Sandbox Code Playgroud)

现在我有以下内容:

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  
Run Code Online (Sandbox Code Playgroud)

Fai*_*sal 186

如果我可以改写你的问题,你想要的是一个字典,其中包含年份作为键和每年包含与该年相关的值列表的数组,对吧?这是我如何做到的:

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]]
Run Code Online (Sandbox Code Playgroud)

你应该在years_dict中得到的结果是一个字典,如下所示:

{
    "2010": [2],
    "2009": [4,7],
    "1989": [8]
}
Run Code Online (Sandbox Code Playgroud)

一般来说,创建"并行数组"的编程实践很差,其中项目通过具有相同的索引而不是包含它们的容器的适当子项而隐式地相互关联.

  • 这绝对是正确的方法,尽管不一定是最简洁的,因为可以使用像`dict.setdefault()`和`collections.defaultdict`这样的酷技巧作为现代Python安装可用的默认工具集的一部分. (18认同)
  • 如果确实使用defaultdict,请将其设置为列表:dd = defaultdict(list) (2认同)

jat*_*ism 100

你最好使用collections.defaultdict(在Python 2.5中添加).这允许您指定缺失键的默认对象类型(例如a 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]})
Run Code Online (Sandbox Code Playgroud)

这样您就不必担心自己是否看过与一年相关的数字.您只需追加并忘记,知道丢失的密钥将始终是一个列表.如果一个密钥已经存在,那么它将被附加到.

  • 这是最好的答案。这里的目的是创建一个列表字典,最简单的方法是使用`defaultdict(list)`。恭喜 (3认同)

Dan*_*man 42

你可以用setdefault.

for line in list:  
    d.setdefault(year, []).append(value)
Run Code Online (Sandbox Code Playgroud)

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


Hug*_*ell 19

d = {} 

# import list of year,value pairs

for year,value in mylist:
    try:
        d[year].append(value)
    except KeyError:
        d[year] = [value]
Run Code Online (Sandbox Code Playgroud)

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

  • python的方式是不重复功能 (6认同)
  • 我看不到这里有重复。 (2认同)

USE*_*R_1 14

以下是使用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)
Run Code Online (Sandbox Code Playgroud)


eri*_*rik 5

如果将这些值添加到元组列表中,将更加容易。为此,您可以使用列表切片和zip功能。

data_in = [2010,2,2009,4,1989,8,2009,7]
data_pairs = zip(data_in[::2],data_in[1::2])
Run Code Online (Sandbox Code Playgroud)

Zip接受任意数量的列表,在这种情况下为的偶数和奇数项data_in,并将它们放到一个元组中。

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

data_dict = {}
for x in data_pairs:
    data_dict.setdefault(x[0],[]).append(x[1])
Run Code Online (Sandbox Code Playgroud)

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