【问题标题】:Converting list of lists to a dictionary with multiple values for a key将列表列表转换为具有多个键值的字典
【发布时间】:2019-05-05 06:29:25
【问题描述】:

我需要编写一个函数,该函数接受代表每个人的朋友的列表列表,并且需要将其转换为字典。 所以[['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']] 的输入应该返回{A:[B,C,D],B:[A],C:[B,D],D:[B],E:None}

输入:

[['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]

预期输出:

{A:[B,C,D],B:[A],C:[B,D],D:[B],E:None}

目前我正在尝试以下方法:

s=[['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]

output=dict.fromkeys((set([x[0] for x in s])),[ ])

for x in s:
    if len(x)>1:
        output[x[0]].append(x[1])
    else:
        output[x[0]].append(None)

但是输出给了我每个键的所有值,而不是只返回相应的值

我得到的输出是:

{
'A': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'B': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'C': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'D': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'E': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None]
}

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    您应该使用通用的字典理解来启动dict

    output = {x[0]: [] for x in s}
    

    dict.fromkeys 为所有键提供相同的参考值。使用可变值是一个问题。理解将为每个键提供一个独立的 list 对象,同时更具可读性。

    【讨论】:

      【解决方案2】:

      您可以遍历列表列表中的键值对,但将值解压缩为列表以适应可能缺少值的情况:

      s = [['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]
      output = {}
      for k, *v in s:
          if v:
              output.setdefault(k, []).extend(v)
          else:
              output[k] = None
      

      output 变为:

      {'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': None}
      

      或者如果你不介意没有值的键得到一个空列表而不是None,你可以简单地这样做:

      output = {}
      for k, *v in s:
          output.setdefault(k, []).extend(v)
      

      output 会变成:

      {'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': []}
      

      【讨论】:

        【解决方案3】:

        问题是您提供给dict.keys 的列表只是跨键的一个引用。

        您想要的结果不一致。我建议您为 'E' 选择一个空列表,无论 似乎 None 更合适。有了这个调整后的要求,您可以使用collections.defaultdict

        from collections import defaultdict
        
        L = [['A','B'],['E','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]
        
        dd = defaultdict(list)
        
        for lst in L:
            if len(lst) > 1:
                dd[lst[0]].append(lst[1])
            else:
                dd[lst[0]]
        
        print(dd)
        
        defaultdict(list,
                    {'A': ['B', 'C', 'D'],
                     'B': ['A'],
                     'C': ['B', 'D'],
                     'D': ['B'],
                     'E': []})
        

        【讨论】:

          【解决方案4】:

          解决这个问题的方法之一如下:

          friend_combi = [['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]  # Input to be processed
          
          final_dict = {} #Empty dict to store result
          for i in friend_combi: # loop through each element in list
              if final_dict.get(i[0]):  #if data present in dict then append else add
                  final_dict[i[0]].append(i[1])
              else:
                  final_dict[i[0]] = [i[1]] if i[1:] else None #check if value exist in list else save None
          print (final_dict)
          #Output --> {'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': None}
          

          我希望这会有所帮助:)

          【讨论】:

            【解决方案5】:

            您可以定义一个名为get_dictionary() 的函数,如下面的代码所示。

            >>> def get_dictionary(l):
            ...     d = {}
            ...     for arr in l:
            ...         if len(arr) == 2:
            ...             key = arr[0]
            ...             if key in d:
            ...                 d[key].append(arr[1])
            ...             else:
            ...                 d[key] = [arr[1]]
            ...         else:
            ...             d[key] = None
            ...     return d
            ...
            >>> l = [['A','B'], ['A','C'], ['A','D'], ['B','A'], ['C','B'], ['C','D'], ['D','B'], ['E']]
            >>>
            >>> get_dictionary(l)
            {'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': None}
            >>>
            

            将字典漂亮地打印为 JSON。

            >>> import json
            >>>
            >>> d = get_dictionary(l)
            >>>
            >>> print(json.dumps(d, indent=4))
            {
                "A": [
                    "B",
                    "C",
                    "D"
                ],
                "B": [
                    "A"
                ],
                "C": [
                    "B",
                    "D"
                ],
                "D": null
            }
            >>>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-12-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-09
              • 1970-01-01
              • 2020-10-15
              • 2021-07-01
              相关资源
              最近更新 更多