首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将包含重复值的列表转换为以列表为值的字典?

如何将包含重复值的列表转换为以列表为值的字典?
EN

Stack Overflow用户
提问于 2016-05-26 11:04:42
回答 3查看 44关注 0票数 3

假设我有两个由另一个函数生成的列表:

代码语言:javascript
复制
test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]
test2 = [[1, 4], [4, 1]]

我希望将它们转换为关联数组,以便快速查找,如下所示:

代码语言:javascript
复制
test: {0: [1, 2], 1: [5,6], 2: [0], 3: [99, 98, 97]}
test2: {1: [4], 4: [1]}

我可以这样做:

代码语言:javascript
复制
def list_to_dict(my_list):
    last_val = my_list[0][0]
    temp = []
    my_dict = {}

    for i in my_list:
        if last_val == i[0]:
            temp.append(i[1])
        else:
            #add the values to this key
            my_dict[last_val] = temp
            #reset the list
            temp = []
            temp.append(i[1])

        last_val = i[0]
    my_dict[last_val] = temp
    return my_dict

但是,这并不是毕达通。有没有更多的毕达通的方法来实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-26 11:10:18

使用collections.defaultdict

代码语言:javascript
复制
>>> test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]
>>> 
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> 
>>> for i, j in test:
...     d[i].append(j)
... 
>>> d
defaultdict(<type 'list'>, {0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]})
票数 5
EN

Stack Overflow用户

发布于 2016-05-26 11:58:20

您也可以通过字典分组来实现这一点,如下所示:

代码语言:javascript
复制
    def list_to_dict(my_list):
        d = {}

        for pair in my_list:
            first = pair[0]
            second = pair[1]
            if first not in d:
                d[first] = []
            d[first].append(second)
        return d

如果键不可用,也可以使用setdefault():

代码语言:javascript
复制
    def list_to_dict(my_list):
        d = {}
        for pair in my_list:
            d.setdefault(pair[0], []).append(pair[1])
        return d

    # Output 

    {0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]}

如果您愿意,可以很容易地将这些操作操作为使用defaultdict。

票数 1
EN

Stack Overflow用户

发布于 2016-05-26 11:49:39

这似乎是itertools.groupby的完美用例。

代码语言:javascript
复制
test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]

import itertools
d = {k:[t[1] for t in g] for k,g in itertools.groupby(test, key=lambda t: t[0])}

print(d)

注意,groupby工作在可迭代项上,默认情况下它返回一个grouper对象。结果如下:

代码语言:javascript
复制
{0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37459042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档