首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将值从列表映射到字典的简单方法

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

Stack Overflow用户
提问于 2021-06-04 01:31:37
回答 5查看 77关注 0票数 1

输入

我有两份名单。

代码语言:javascript
复制
rule_seq = 
[['#1', '#2', '#3'], 
 ['#1', '#2', '#3']]

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

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

我想要的输出是

输出

代码语言:javascript
复制
unify_dict = 
{'#1': ['nationality'],
 '#2': ['placeOfBirth', 'hasFather'],
 '#3': ['locatedIn', 'nationality']}

我创建了一个字典,如下所示,通过对两个列表列表进行压缩和压缩,以检查字典中是否有键和值。

我的代码如下。

代码语言:javascript
复制
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)

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-06-04 01:39:24

您可以使用第二级嵌套使用相同的defualtdict调用append。

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
defaultdict(<class 'list'>,
            {'#1': ['nationality'],
             '#2': ['placeOfBirth', 'hasFather'],
             '#3': ['locatedIn', 'nationality']})
票数 2
EN

Stack Overflow用户

发布于 2021-06-04 01:39:36

您可以使用collections

代码语言:javascript
复制
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'],
# }
票数 1
EN

Stack Overflow用户

发布于 2021-06-04 01:43:31

这将是我自制的方法,不使用模块。香草蟒蛇。

代码语言:javascript
复制
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)}

输出

代码语言:javascript
复制
{'#1': ['nationality'], '#2': ['hasFather', 'placeOfBirth'], '#3': ['nationality', 'locatedIn']}

过度简化版

代码语言:javascript
复制
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)

欠简化

代码语言:javascript
复制
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]))]])}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67830404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档