【问题标题】:Group dict elements based on a specified dict value根据指定的字典值对字典元素进行分组
【发布时间】:2023-01-17 20:49:45
【问题描述】:

我有这个数据:

data = 
{
   "a":{
      "00066554466":{
         "Id":650,
         "Passwd":"e1c2a06545de9164d7e87cd98bed57c5",
         "zone":"Europe/Zurich"
      },
      "8745212300":{
         "Id":400,
         "Passwd":"ecb95502daace7f46bf12b484d086e5b",
         "zone":"Europe/Zurich"
      },
      "8745212301":{
         "Id":401,
         "Passwd":"ecb95502daace7f46bf12b484d086e5b",
         "zone":"Europe/Zurich"
      },
      "8745212302":{
         "DevId":402,
         "Passwd":"ecb95502daace7f46bf12b484d086e5b",
         "zone":"Europe/Zurich"
      }
   }
}

我想用相同的密码对密钥进行分组。所以结果应该像下面这样。

{
   "e1c2a06545de9164d7e87cd98bed57c5":[
      "00066554466"
   ],
   "ecb95502daace7f46bf12b484d086e5b":[
      "8745212300",
      "8745212301",
      "8745212302"
   ]
}

我尝试使用 itertools.groupby 和 for k,v in xxx,但结果永远不是我需要的。

【问题讨论】:

  • 你在外部字典中有不止一个键吗?如果是,其余数据如何?

标签: python dictionary


【解决方案1】:

itertools.groupby 在数据已经按照要按连续顺序分组的值进行排序时效果很好,但您的数据可能并非总是如此。

而是使用 dict.setdefault 和嵌套循环:

out = {}

for d1 in data.values():
    for k, d2 in d1.items():
        out.setdefault(d2['Passwd'], []).append(k)

print(out)

带有 defaultdict 的变体:

from collections import defaultdict

out = defaultdict(list)

for d1 in data.values():
    for k, d2 in d1.items():
        out[d2['Passwd']].append(k)

print(dict(out))

输出:

{'e1c2a06545de9164d7e87cd98bed57c5': ['00066554466'],
 'ecb95502daace7f46bf12b484d086e5b': ['8745212300', '8745212301', '8745212302']}

【讨论】:

  • 两者都有效,谢谢
【解决方案2】:

一种解决方案,但可能不是 pythonic 只是为了:

passwd_group = {}

for k, val in data["a"]:

    if val["Passwd"] not in passwd_group:
        passwd_group[val["Passwd"]] = []

    passwd_group.append(k)
    

【讨论】:

    【解决方案3】:

    这可能不理想,但可以正常工作。

    new_dict = {}
    for L in data.keys():
        x = data[L]
        for M in x.keys():
            y = x[M]
            for N in y.keys():
                if N == "Passwd":
                    new_list = new_dict.get(y[N], [])
                    new_list.append(M)
                    new_dict[y[N]] = new_list
    print(new_dict)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多