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

时间:2017-12-15 02:23:42

标签: python list dictionary data-structures

通过遍历python列表,我想创建一个列表词典,每个词典的值也是一个列表。

结构将是:

[{key1: [val1, val2]}, {key2: [val3, val4]}, {key3: [val5, val6]}, ...]

我从一个整数列表开始:

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

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

以下是最终结果:

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

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

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
  1. 我不喜欢我必须命名一个空字典,并让它们各自命名相同的东西(这里,d)。之后,我想通过钥匙访问这些词典 - 我不在乎他们的名字。

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

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

    new_list = []
    for i in my_list:
        d = {}
        d[i] = [].append('dog')
        new_list.append(d)
        my_list.remove(i)
    
  4. 但这感觉非常笨拙。

4 个答案:

答案 0 :(得分: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很有帮助,因为它使用空列表初始化字典中的每个条目。如果您不想这样做,您可以使用普通词典实现此目的,如问题所示,但这需要您自己初始化空列表。

答案 1 :(得分: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 :(得分: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']}]

答案 3 :(得分: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']}