繁体   English   中英

从另一个字典创建新的值组合字典

[英]Create new dictionary of value combinations from another dictionary

我有以下字典。

dict = {}
dict['key1'] = ['A', 'B', 'C']
dict['key2'] = ['B', 'D']
dict['key3'] = ['A', 'C', 'E']

我想创建一个新词典,其中包含同一列表中所有字母与其他字母的组合。

我希望最终结果看起来像这样。

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

我试图初始化一个新的空列表字典并遍历每个列表以将组合和 append 获取到列表字典,但我似乎遗漏了一些东西。

dict = {}
dict['key1'] = ['A', 'B', 'C']
dict['key2'] = ['B', 'D']
dict['key3'] = ['A', 'C', 'E']

dict2={}
list = ['A', 'B', 'C', 'D', 'E']

# instantiate dict2
for i in list:
    dict2[i]=[]

for idx, key in enumerate(dict):
    print(key, dict[key])
    tmp = dict[key]
        for x in tmp:
           tmp.remove(x)
           for y in tmp:
               dict2[x].append(y)

我建议使用集合字典作为中间步骤,然后转换为列表以获得最终结果:

# Initial data.  (Don't use 'dict' as a variable name!)
my_dict = {
    'key1': ['A', 'B', 'C'],
    'key2': ['B', 'D'],
    'key3': ['A', 'C', 'E'],
}

# Build all combinations as a dict of sets.
all_combos = {}
for v in my_dict.values():
    for x in v:
        all_combos.setdefault(x, set()).update(v)
        all_combos[x].remove(x)

# Convert dict of sets to dict of sorted lists.
final_dict = {k: sorted(v) for k, v in all_combos.items()}
from pprint import pprint
pprint(final_dict)

印刷:

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

只是通过集合理解方法来补充 Samwise 的方式:

dict = {}
dict['key1'] = ['A', 'B', 'C']
dict['key2'] = ['B', 'D']
dict['key3'] = ['A', 'C', 'E']

dict2 = {key: val for key, val in zip(set([item for sublist in dict.values() for item in sublist]), [set([item for sublist in [x for x in dict.values() if key in x] for item in sublist]) for key in set([item for sublist in dict.values() for item in sublist])])}

最后一步只是从每组中删除密钥,但我相信你能够做到这一点:)

使用collections.defaultdict我们可以首先创建一个字典,列出每个字符出现的所有字符。

然后我们可以使用字典理解将这些列表转换为一个集合并删除实际的关键字符。

from collections import defaultdict

d = defaultdict(list)

for k, v in my_dict.items():
  s = set(v)
  for c in s:
    d[c] += list(s)

# d = defaultdict(<class 'list'>, {'A': ['A', 'C', 'B', 'A', 'C', 'E'], 'C': ['A', 'C', 'B', 'A', 'C', 'E'], 'B': ['A', 'C', 'B', 'D', 'B'], 'D': ['D', 'B'], 'E': ['A', 'C', 'E']})
    
e = {k: set(v) ^ set([k]) for k, v in d.items()}

# e = {'A': {'C', 'B', 'E'}, 'C': {'A', 'B', 'E'}, 'B': {'C', 'A', 'D'}, 'D': {'B'}, 'E': {'A', 'C'}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM