【问题标题】:Transform a list of set to dictionary [closed]将集合列表转换为字典 [关闭]
【发布时间】:2021-02-04 13:41:58
【问题描述】:

我有一个这样的元组列表:

l=[(5, 8),(5, 9),(5, 22),(5, 6),(1, 5),(4, 5),(3, 5),(2, 5),(8, 22),(9, 22)]

我想为每个值生成一个字典;例如,我将出现的值设置为 8 我将拥有 [5,22]。

这应该是最终结果:

{1: [5],
 2: [5],
 3: [5],
 4: [5],
 5: [8, 9, 22, 6, 1, 4, 3, 2],
 6: [5],
 8: [5, 22],
 9: [5, 22],
 22: [5, 8, 9]}

我正在这样做并且它工作正常,但我觉得它没有优化并且“硬编码”是否有更好的版本

dic={}
for n in set([item  for sublist in l for item in sublist]):
        ll=[]
        for item in  [sublist for sublist in l]:
            if n in item :
                ll.append(item[list({0,1}-{item.index(n)})[0]])
        dic[n]=ll
        

【问题讨论】:

  • 可以试试 codereview.stackexchange.com 吗?
  • 谢谢你,是的,下次我会在那里问,我不知道,对不起

标签: python list dictionary set


【解决方案1】:

你可以使用collections.defaultdict():

import pprint
from collections import defaultdict
l=[(5, 8),(5, 9),(5, 22),(5, 6),(1, 5),(4, 5),(3, 5),(2, 5),(8, 22),(9, 22)]

d = defaultdict(list)
for key, value in l:
    d[key].append(value)
    d[value].append(key)

pprint.pprint(d)

输出:

defaultdict(<class 'list'>,
            {1: [5],
             2: [5],
             3: [5],
             4: [5],
             5: [8, 9, 22, 6, 1, 4, 3, 2],
             6: [5],
             8: [5, 22],
             9: [5, 22],
             22: [5, 8, 9]})

【讨论】:

    【解决方案2】:

    我会这样做,它似乎比你的实际代码更清晰:

    l=[(5, 8),(5, 9),(5, 22),(5, 6),(1, 5),(4, 5),(3, 5),(2, 5),(8, 22),(9, 22)]
    
    result = {}
    for (i, v) in l:
        if i in result:
            result[i].append(v)
        else:
            result[i] = [v]
        if v in result:
            result[v].append(i)
        else:
            result[v] = [i]
    
    print(result) # {5: [8, 9, 22, 6, 1, 4, 3, 2], 8: [5, 22], 9: [5, 22], 22: [5, 8, 9], 6: [5], 1: [5], 4: [5], 3: [5], 2: [5]}
    

    【讨论】:

      【解决方案3】:
      l = [(5, 8),(5, 9),(5, 22),(5, 6),(1, 5),(4, 5),(3, 5),(2, 5),(8, 22),(9, 22)]
      d = {}
      
      for i, j in l:
          d.setdefault(i, []).append(j)
          d.setdefault(j, []).append(i)
      
      d
      
      {5: [8, 9, 22, 6, 1, 4, 3, 2],
       8: [5, 22],
       9: [5, 22],
       22: [5, 8, 9],
       6: [5],
       1: [5],
       4: [5],
       3: [5],
       2: [5]}
      

      【讨论】:

        猜你喜欢
        • 2022-11-12
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        • 2011-04-27
        • 1970-01-01
        • 2011-08-02
        • 2022-01-03
        • 2014-01-30
        相关资源
        最近更新 更多