如何从键列表和相同值生成字典列表

5

我希望从一个键列表中创建一个字典列表,每个字典都具有相同的值。

结构如下:

[{key1: value}, {key2: value}, {key3: value}, ...]

我开始列举一些关键点:

我开始列举一些关键点:

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

假设这个值是['dog', 'cat']

这里是最终的结果应该看起来的样子:

[{3423:['dog', 'cat']}, {77813:['dog', 'cat']}, {12:['dog', 'cat']},
 {153:['dog', 'cat']}, {1899:['dog', 'cat']}]

1
你是否必须使用这种结构来达到你的目标?面向对象的方法可以减少一些复杂性,具体取决于你想要实现什么。至少你可以看一下“collections”模块中的“defaultdict”。然后你可以执行“list_dict = defaultdict(list)”,这样你就知道字典中的每个条目已经是一个空列表了。 - Thomas Fauskanger
4个回答

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']}]

此外,这里有一个使用非常方便的 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)

这将输出:

[{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}]

在这里使用 defaultdict 是有帮助的,因为它会用空列表初始化字典中的每个条目。如果您不想这样做,可以像您的问题所示使用普通字典实现,但是这需要您自己初始化空列表。


2
你可以使用一个 collections.defaultdict 字典子类来使处理变得非常简单:
from collections import defaultdict
from pprint import pprint

my_list = [3423, 77813, 12, 153, 1899]
d = defaultdict(list)

for i in my_list:
    d[i].append('dog')
    d[i].append('cat')

d = dict(d)  # Convert d into a regular dictionary (optional).
pprint(d)

输出:

{12: ['dog', 'cat'],
 153: ['dog', 'cat'],
 1899: ['dog', 'cat'],
 3423: ['dog', 'cat'],
 77813: ['dog', 'cat']}

当然,如果你只是要将这两个项目附加到每个条目中,那么用以下单个操作执行两者会更有效率:
for i in my_list:
    d[i].extend(['dog', 'cat'])

2
如果您想使用列表推导式并针对每个键使用不同的值。
keys = ['key1', 'key2', 'key3']
values = [['val11', 'val12'], ['val21', 'val22'], ['val31', 'val32']]

# This is what you want (if I understood correctly)
dlist = [{x:values[i]} for i,x in enumerate(keys)]

print(dlist)

# When you want to add more dictionary to the list
dlist.append({'key4': ['val41', 'val42']})

print(dlist)

输出:

[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}]
[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}, {'key4':['val41', 'val42']}]

2

您不需要删除,也不需要导入任何外部模块或使其过于复杂。您可以简单地按照以下纯Python模式进行:

data = ['dog', 'cat']

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

new_data={}
for item in my_list:
    for sub_item in data:

        if item not in new_data:
            new_data[item]=[sub_item]
        else:
            new_data[item].append(sub_item)

print(new_data)

输出:

{153: ['dog', 'cat'], 1899: ['dog', 'cat'], 12: ['dog', 'cat'], 77813: ['dog', 'cat'], 3423: ['dog', 'cat']}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接