将值从列表列表映射到字典的简单方法

2024-06-09 17:00:07 发布

您现在位置:Python中文网/ 问答频道 /正文

输入

我有两张名单

rule_seq = 
[['#1', '#2', '#3'], 
 ['#1', '#2', '#3']]

KG_seq = 
[['nationality', 'placeOfBirth', 'locatedIn'],
 ['nationality', 'hasFather', 'nationality']]

我必须将同一索引中的值映射到字典,其中rule_seq的值作为上面列表中的键

我期望的输出是

输出

unify_dict = 
{'#1': ['nationality'],
 '#2': ['placeOfBirth', 'hasFather'],
 '#3': ['locatedIn', 'nationality']}

我制作了一个字典,如下所示,通过对两个列表进行展平和压缩来检查字典中是否有键和值

我的代码如下

def create_unify_dict(rule_seq, KG_seq):
    unify_dict = collections.defaultdict(list)   
    flat_aug_rule_list = list(itertools.chain.from_iterable(rule_seq))
    flat_aug_KG_list = list(itertools.chain.from_iterable(KG_seq))
    
    [unify_dict[key].append(val) for key, val in zip(flat_aug_rule_list, flat_aug_KG_list) 
     if key not in unify_dict.keys() or val not in unify_dict[key]]
    
    return unify_dict

unify_dict = create_unify_dict(rule_seq, KG_seq)

有没有更简单的方法来获得我想要的结果


Tags: keyin字典valruleseqdictaug
3条回答

这将是我不使用模块的自制方法香草Python

combine = [list(set(l)) for l in [[lst[i] for lst in KG_seq] for i in range(len(KG_seq[0]))]]
dct = {place:st for place,st in zip(rule_seq[0],combine)}

输出

{'#1': ['nationality'], '#2': ['hasFather', 'placeOfBirth'], '#3': ['nationality', 'locatedIn']}

过于简化的版本

combine = []
for i in range(len(KG_seq[0])):
    group = []
    for lst in KG_seq:
        group.append(lst[i])
    combine.append(group)
newComb = []
for simp in combine:
    newComb.append(list(set(simp)))
dct = {}
for place,st in zip(rule_seq[0],combine):
    dct[place] = st
print(dct)

欠简化

dct = {place:st for place,st in zip(rule_seq[0],[list(set(l)) for l in [[lst[i] for lst in KG_seq] for i in range(len(KG_seq[0]))]])}

您可以使用collections

import collections

# Create a defaultdict with list as value type
result = collections.defaultdict(list)
for s0, s1 in zip(rule_seq, KG_seq):
    for v0, v1 in zip(s0, s1):
        if v1 not in result[v0]:
            result[v0].append(v1)
        
print({k: v for k, v in result.items()})
# {
#   '#1': ['nationality'], 
#   '#2': ['placeOfBirth', 'hasFather'],
#   '#3': ['locatedIn', 'nationality'],
# }

您可以使用与第二层嵌套相同的defualtdict调用append

from collections import defaultdict
result = defaultdict(list)

for keyList,valueList in zip(rule_seq, KG_seq):
    for key,item in zip(keyList, valueList):
       if item not in result[key]: result[key].append(item)

输出

defaultdict(<class 'list'>,
            {'#1': ['nationality'],
             '#2': ['placeOfBirth', 'hasFather'],
             '#3': ['locatedIn', 'nationality']})

相关问题 更多 >