【问题标题】:How to convert [[A, B], [A, C], [A, D]] list into {A: [B, C, D]} dictionary in Python? [duplicate]如何在 Python 中将 [[A, B], [A, C], [A, D]] 列表转换为 {A: [B, C, D]} 字典? [复制]
【发布时间】:2018-04-27 11:41:53
【问题描述】:

假设我们有一个列表列表,其中嵌套列表包含两个元素 [A, B]。现在,您想将这样的列表转换为字典,其中第一个元素应该是键,第二个元素应该是它的值。例如:

[['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['B', 'C1'], ['C', 'B2'], ['C', 'C2'], ['C', 'D2']] -->

{'A': ['B', 'C', 'D'], 'B': ['B1', 'C1'], 'C': ['B2', 'C2', 'D2']}

应保持值的顺序。

我有一个简单的解决方案:

lst = [['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['C', 'C1']]
dic = {}
for el in lst:
    if dic.get(el[0]) is None:
        dic[el[0]] = [el[1]]
        continue
    dic[el[0]].append(el[1])

还有一个丑陋的列表理解解决方案,它的速度要慢得多,因为它对每个键的完整数据执行循环。

dic = dict([(el[0], [e[1] for r in lst if e[0] == el[0]])
            for el in lst])

应该有更好、更优雅的方式来做到这一点。你能想出什么办法吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    使用默认字典:

    from collections import defaultdict
    dic = defaultdict(list)
    for k, v in lst:
        dic[k].append(v)
    

    【讨论】:

    • 来吧,这是第 100 次重复...
    【解决方案2】:

    defaultdict 的替代方法是使用普通dict.setdefault 方法。

    lst = [
        ['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'],
        ['B', 'C1'], ['C', 'B2'], ['C', 'C2'], ['C', 'D2'],
    ]
    
    dic = {}
    for key, val in lst:
        dic.setdefault(key, []).append(val)
    print(dic)
    

    输出

    {'A': ['B', 'C', 'D'], 'B': ['B1', 'C1'], 'C': ['B2', 'C2', 'D2']}
    

    这将保留所有 Python 版本中值的顺序,并且在 Python 3.6+ 中它还将保留键的顺序。

    【讨论】:

    • 是的,重复回答了很多次
    • @Jean-FrançoisFabre 够公平的。但是你不能找到一个使用.append 而不是.extend 的好的欺骗目标吗?当然,它们是相似的,但是在您的目标中使用的扩展案例比执行简单的附加要复杂一些。
    • 我已经见过很多次了。只是我现在找不到我见过的骗子。
    • 啊找到了一个更好的。也就是说,我喜欢这个特别的问题。很明显,与相关的问题相反。我可能没有找到完美的骗子,但一个:)
    • @Jean-FrançoisFabre 很难找到一个好的骗子。这些问题往往相当具体,虽然专家可能能够应用不同问题的代码,但对于新的编码人员来说可能并不容易,因此只需编写一个新的答案就更容易了。
    【解决方案3】:

    另一种方法是:

    l = [['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['B', 'C1'], ['C', 'B2'], ['C', 'C2'], ['C', 'D2']]
    
    d = dict((elem[0],[]) for elem in l)
    for elem in l:
        d[elem[0]].append(elem[1])
    print(d)
    

    输出:

    {'A': ['B', 'C', 'D'], 'B': ['B1', 'C1'], 'C': ['B2', 'C2', 'D2']}
    

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      相关资源
      最近更新 更多