【问题标题】:Populating a dictionary from a nested list从嵌套列表中填充字典
【发布时间】:2021-10-15 21:02:32
【问题描述】:

所以我有一个用对嵌套列表的列表:

my_list = [[5,8],[5,10],[3,1],[10,18],[10,20],[21,30]

现在我想要一个字典,它将第一个数字作为键,然后列出所有匹配的第二个数字作为值:所以 {3: [1], 5: [8,10], 10: [18,20], 21:[30]}

我已经有了一个字典,其中包含必要的唯一键和已排序的空值键。现在如何使用列表中的正确值填充此字典?

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:
    def foo(d, arr):
        for k, v in arr:
            if d.get(k):
                d[k].append(v)
            else:
                d[k] = [v]
                
    d = {}
    foo(d, my_list)
    d
    # {5: [8, 10], 3: [1], 10: [18, 20], 21: [30]}
    

    【讨论】:

    • d.setdefault(k, []).append(v) 可能是更好的解决方案。
    • 更好,是的@HampusLarsson,但我认为 OP 需要首先专注于学习基础知识。
    【解决方案2】:

    使用dict.setdefault,我们可以在新字典内部动态创建内部结构,而无需检查字典内部的key是否已经存在:

    my_list = [[5, 8], [5, 10], [3, 1], [10, 18], [10, 20], [21, 30]]
    
    d = {}
    for key, value in my_list:
        d.setdefault(key, []).append(value)
    
    print(d) # Output: {5: [8, 10], 3: [1], 10: [18, 20], 21: [30]}
    

    【讨论】:

    • 谢谢!这做了我想做的事,而且看起来很简单。
    【解决方案3】:

    您可以通过map() 实现此目的:

    output = {}
    def mapper(elem):
        values = output.get(elem[0], [])
        values.append(elem[1])
        output[elem[0]] = values
        return output
    
    map(mapper, my_list)
    

    正如@DeepSpace 所述,此解决方案在 Python 3 中无效。

    【讨论】:

    • 这仅在 Python 2 上有效(如已发布),绝对不应该在 21 年 10 月使用。在 Python 3 中,在调用 map 之后打印 output 将显示它是一个空字典
    • 你能解释更多吗? map() 已在 Python 3.10 docs.python.org/3/library/functions.html#map 中使用
    • 我没有写 Python 3 没有map,只是因为map 返回了一个惰性对象,因此必须对其进行迭代才能通过实际调用的函数。无论如何,对于map,这不是一个好的用例
    • 感谢您的解释
    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 2016-11-25
    • 2017-04-07
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多