如何从列表中生成字典列表(带列表值)?

EB2*_*127 5 python dictionary list data-structures

通过迭代python列表,我想创建一个列表字典,其中每个字典的值也是一个列表.

结构将是:

[{key1: [val1, val2]}, {key2: [val3, val4]}, {key3: [val5, val6]}, ...]
Run Code Online (Sandbox Code Playgroud)

我从一个整数列表开始:

my_list = [3423, 77813, 12, 153, 1899]
Run Code Online (Sandbox Code Playgroud)

对于列表中的每个元素,这应该成为字典键.然后我将两个项附加到字典的值(这是一个列表).(假设这两个项目总是"狗"和"猫")

以下是最终结果:

[{3423:['dog', 'cat']}, {77813:['dog', 'cat']}, {12:['dog', 'cat']},
    {153:['dog', 'cat']}, {1899:['dog', 'cat']}]
Run Code Online (Sandbox Code Playgroud)

我尝试这样做有很多问题:

for i in my_list:
    d = {}   ## create a dictionary 'd'
    d[i] = [].append('dog')  ## or  `d[i] = ['dog'].append('cat')`
    my_list.append(d)   ## here is a bug
    my_list.remove(i) ## remove the item from the list
Run Code Online (Sandbox Code Playgroud)
  1. 我不喜欢我必须命名一个空字典,让它们各自命名相同的东西(这里d).后来,我想用钥匙访问这些词典 - 我不在乎他们的名字.

  2. 当它实际上应该是一个列表时,我不知道如何合理地将多个项附加到字典值.如果我想添加几个项目怎么办?

  3. 该错误是将字典附加到原始列表,然后删除该项目.当然,这可以通过一个新的列表来解决:

    new_list = []
    for i in my_list:
        d = {}
        d[i] = [].append('dog')
        new_list.append(d)
        my_list.remove(i)
    
    Run Code Online (Sandbox Code Playgroud)

但这感觉非常笨拙.

Roa*_*ner 6

如果你想要一些非常简单的东西,你可以使用列表理解:

data = ['dog', 'cat']

my_list = [3423, 77813, 12, 153, 1899]

result = [{k:data} for k in my_list]

print(result)
# [{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}]
Run Code Online (Sandbox Code Playgroud)

此外,这里是一个非常方便添加/删除值的示例defaultdict:

from collections import defaultdict

my_list = [3423, 77813, 12, 153, 1899]

new_list = []
for number in my_list:

    # create the defaultdict here
    d = defaultdict(list)

    # add some data
    d[number] += ['dog', 'cat', 'kitten']

    # remove some data
    d[number].remove('kitten')

    # append dictionary
    new_list.append(dict(d))

print(new_list)
Run Code Online (Sandbox Code Playgroud)

哪个输出:

[{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}]
Run Code Online (Sandbox Code Playgroud)

使用defaultdicthere非常有用,因为它使用空列表初始化字典中的每个条目.如果您不想这样做,可以使用普通字典实现此目的,如问题所示,但这需要您自己初始化空列表.