嵌套列表中具有多个值的字典

时间:2013-08-30 21:21:31

标签: python

我正在尝试从嵌套列表创建字典。但是,我遇到了将值附加到字典的问题,因为它们是字符串。这有创意解决方案吗?也许将我的琴弦分成另一个列表?

my_list = [('key1', 'topic1', 'content1'), ('key2', 'topic1', 'content2'), ('key3', 'topic2', 'content3')]

my_dict = {}
for list in my_list:
    for val in list:
        if list[1] in my_dict:
            my_dict[list[1]].append(list[2])
        else:
            my_dict[i[1]] = i[2] 

我想回来:

[{'topic1': 'content1', 'content2'}, {'topic2': 'content3'}]

3 个答案:

答案 0 :(得分:1)

每个字典条目的值必须是另一个集合。列表或集合取决于具有重复项的预期行为。

    my_dict = {}
    for list in my_list:
        if list[1] in my_dict:
            my_dict[list[1]].append(list[2])
        else:
            my_dict[list[1]]= [ list[2]  ]

这是您当前最接近的代码。略有改进的版本是:

    my_dict = {}
    for triplet in my_list:
        if triplet[1] in my_dict:
            my_dict[triplet[1]].append(triplet[2])
        else:
            my_dict[triplet[1]]= [ triplet[2]  ]

鉴于该语言已使用list,并且my_list元素不是列表而是元组(在特定情况下为三元组)。出于同样的原因,你也可以写:

    my_dict = {}
    for _, my_key, my_value in my_list:
        if my_key in my_dict:
            my_dict[my_key].append(my_value)
        else:
            my_dict[my_key]= [ my_value  ]

最后,您可以使用defaultdict(第一次引用时自动初始化与键对应的值的字典)。

    my_dict = collections.defaultdict(list)
    for _, my_key, my_value in my_list:
        my_dict[my_key].append(my_value)

如果您稍后要使用字典来检查密钥的存在/不存在,则必须记住,对于defaultdict,所有密钥始终存在(在查询时创建)。在这种情况下,最好的解决方案是将defaultdict复制到常规的:

    my_regulardict= dict( my_defaultdict )

答案 1 :(得分:1)

my_list = [('key1', 'topic1', 'content1'), ('key2', 'topic1', 'content2'), ('key3', 'topic2', 'content3')]

result={}
for t in my_list:
    result.setdefault(t[1],[]).append(t[2])

print result    

答案 2 :(得分:0)

这是collections.defaultdict的一个案例:

import collections

my_list = [('key1', 'topic1', 'content1'), ('key2', 'topic1', 'content2'), ('key3', 'topic2', 'content3')]

my_dict = collections.defaultdict(list)

for _, key, value in my_list:
    my_dict[key].append(value)

print(my_dict)

给我们:

defaultdict(<class 'list'>, {'topic2': ['content3'], 'topic1': ['content1', 'content2']})

defaultdict创建值的列表(如果它不存在),这意味着我们可以通过循环遍历列表并将值附加到键来轻松地完成此操作。它在其他任何方面都与普通字典完全相同,但如果您需要正常字典,则可以在其上使用dict()