如何将值附加到尚不存在的键?

Posted

技术标签:

【中文标题】如何将值附加到尚不存在的键?【英文标题】:How to append a value to a not yet existing key? 【发布时间】:2014-08-26 12:59:35 【问题描述】:

我有一本这样的字典:

dct = 'one': 'value', 
       'two': ['value1','value2','value1'], 
       'three':['otherValue1','otherValue2','otherValue1'],
       'dontCareAboutThisKey':'debug'

我需要从列表中删除重复值。我写了一个函数来做到这一点:

no_dups = 
    for keys in dct:
        if isinstance(dct[keys], list) and keys != 'dontCareAboutThisKey':
            for value in dct[keys]:
                if value not in no_dups.values():
                    no_dups[keys].append(value)
        else:
            no_dups[keys] = dct[keys]

我正在检查当前键的值是否是一个列表。如果不是,它只是将键“复制”到no_dups 字典。如果它是一个列表而不是我不关心的键(肯定没有重复项) - 它应该检查no_dups.values() 中是否已经存在当前值并将其附加到当前键。问题是我收到了一个错误:

KeyError: 'two:'

我知道这是因为我试图为不存在的键添加一个值,但我不知道如何处理它并使其工作。

【问题讨论】:

在哪一行抛出错误? no_dups[keys].append(value) 【参考方案1】:

我认为同时处理添加键和附加的最佳方法是使用dicts的setdefault()方法:

no_dups.setdefault(keys,[]).append(value)

但除此之外,您可以像这样以更简洁的方式执行此操作:

#remove duplicates
no_dups = k:list(set(v)) if isinstance(v, list) and k != 'dontCareAboutThisKey' else v 
           for k,v in dct.items()  # or dct.iteritems() if using python2.x

对于通过 if 测试的键值组合,该 hack 将列表转换为集合(删除重复项),然后再次转换为列表。对于其他键值组合,它将保持原样。

【讨论】:

这很难理解,但我会努力的。谢谢你:) 太棒了,没有魔法,Python 的理解力真的很强大,而且很适合练习。 我知道,我知道.. 但是Learning Python 有 1500 页,我读不了这么快。再次感谢您的回答:)【参考方案2】:
dct = 'one': 'value', 
       'two': ['value1','value2','value1'], 
       'three':['otherValue1','otherValue2','otherValue1'],
       'dontCareAboutThisKey':'debug'

set(dct) 返回一个set,这是一个没有重复的列表:

for key, value in dct.items():
    if not isinstance(value, basestring):
        dct[key] = set(value)

如果你需要一本新字典,你可以这样做:

new_dct = 
for key, value in dct.items():
    if not isinstance(value, basestring):
        new_dct[key] = set(value)
    else:
        new_dct[key] = value

【讨论】:

我不确定 OP 是否真的想创建一个副本,因为这将就地编辑...但是...对我来说似乎是一个不错的方法 我不知道set()。现在容易多了。谢谢你。我想接受两个答案,但这是不可能的。 Paulo Bu 是 set() 函数的第一人,所以我会接受他的回答,但我会使用你的,因为它对初学者用户来说并不复杂 :)【参考方案3】:

如果您想删除重复项,只需将您的列表更改为设置,使用 set() 函数:

https://docs.python.org/2/tutorial/datastructures.html#sets

它会自动为您提供唯一的集合,然后您可以随时将其更改回列表。

【讨论】:

感谢您提供有关套装的信息。我会记住的:)

以上是关于如何将值附加到尚不存在的键?的主要内容,如果未能解决你的问题,请参考以下文章

附加到 csh 中可能尚不存在的环境变量的简单方法

php 在数组中的特定键后插入值或键/值对。如果key不存在,则将值附加到数组的末尾。

php 在数组中的特定键后插入值或键/值对。如果key不存在,则将值附加到数组的末尾。

如何模拟尚不存在的节点模块?

如何使用添加查询添加表中尚不存在的记录

当 DLQ 尚不存在时,如何通过 Terraform 配置 SQS?