首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:附加到dict值(如果已经存在的话是一个列表),将添加到所有键的值,而不是

Python:附加到dict值(如果已经存在的话是一个列表),将添加到所有键的值,而不是
EN

Stack Overflow用户
提问于 2016-10-25 15:19:39
回答 1查看 74关注 0票数 1

Python输出没有按照示例代码正确地将字符串值添加到循环中的dict键的列表值中。

收到的产出:

代码语言:javascript
复制
{'one': ['dev-1', 'dev-3'], 'three': ['dev-1', 'dev-3'], 'five': ['dev-3'],
    'four': ['dev-3'], 'two': ['dev-1', 'dev-3']}

预期产出:

代码语言:javascript
复制
{'one': ['dev-1', 'dev-3'], 'three': ['dev-1'], 'five': ['dev-3'], 
    'four': ['dev-3'], 'two': ['dev-1']}

以下是守则:

代码语言:javascript
复制
grp = ['instance "dev-1"\n', 'row id 68\n', 'grp mem "one"  "two" "three"\n', 'next\n',
    'instance "dev-3"\n', 'row id 18d\n', 'grp mem "four" "five" "one"', 'next\n']
grp_no = 0
mapping_dict = {}
current_grp = []
while grp_no < len(grp):
    line = grp[grp_no]
    if grp_no < len(grp):
        instance = line.startswith('instance ')
        grp_member = line.startswith('grp mem ')
        if not (instance or grp_member):
            grp_no += 1
            continue
        if instance:
            obj_id = (line.split()[1]).strip('"')
            current_grp.append(obj_id)
        if grp_member:
            current_members = line.split()
            for i in range(2, len(current_members), 1):
                mem = current_members[i]
                mem = mem.strip('"')
                check_point = mem in mapping_dict and (obj_id in mapping_dict[mem])
                check_point1 = mem in mapping_dict and not obj_id in mapping_dict[mem]
                if check_point:
                    continue
                elif check_point1:
                    (mapping_dict[mem]).append(obj_id)
                else:
                    mapping_dict[mem] = current_grp
            current_grp = []
    grp_no += 1
print(mapping_dict)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-25 16:36:32

您的问题是在多个字典键之间共享相同的列表:

代码语言:javascript
复制
>>> for k, v in mapping_dict.items():
...     print(id(v), k, v)
...
41955656 four ['dev-3']
41897936 one ['dev-1', 'dev-3']
41897936 three ['dev-1', 'dev-3']
41897936 two ['dev-1', 'dev-3']
41955656 five ['dev-3']

要实现你想要的,有一种更简单的方法:

代码语言:javascript
复制
mapping_dict = {}
instance = None
for line in grp:
    if line.startswith('instance'):
        instance = line.split('"')[1]
    elif line.startswith('grp mem'):
        for member in line[7:].replace('"', '').split():
            mapping_dict.setdefault(member, []).append(instance)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40243754

复制
相关文章

相似问题

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