0

这是我正在查看的问题:获取字典列表。在这里面,你可以有有效和无效结果的明显案例。因此,您在列表推导中编写了一个简单的三元运算符,以获取失败时的默认消息。但是,它为每个失败提供了默认值。

如果您知道所有列表的长度相同,是否可以将其减少为同一理解内的单个失败消息?

此示例代码中的目标是,如果键不在列表内的字典中,则确定其值为“DEFAULT”。为了测试,完成了一个简单的打印:

print(out)
>>> ['DEFAILT']

这是我的测试数据和一个简单、成功的结果:

lis_dic = [{1:'One',2:'Two',3:'Three'},
    {1:'Ichi',2:'Ni',3:'San'},
    {1:'Eins',2:'Zvi',3:'Dri'}]
key = 1
out = [i[key] for i in lis_dic]
print(out)
>>> ['One', 'Ichi', 'Eins']

错误处理尝试:

key = 4
out = [i[key] for i in lis_dic if key in i]
print(out)
>>> []

out = [i.get(key, 'DEFAILT') for i in lis_dic]
print(out)
>>> ['DEFAILT', 'DEFAILT', 'DEFAILT']

out = [i[key] if key in i else 'DEFAULT' for i in lis_dic ]
print(out)
>>> ['DEFAILT', 'DEFAILT', 'DEFAILT']

如您所见,所有这些都导致没有结果或三个结果,而不是单个结果。

我也尝试移动 else 的位置,但我不断收到语法错误。

哦,这没用,因为它可以更改有效结果的顺序:

out = list(set([i[key] if key in i else 'DEFAULT' for i in lis_dic ]))
4

3 回答 3

2

键不在三个字典中的任何一个中,因此'DEFAULT'生成了 3 次值。如果第一个字典包含该值而其他两个没有,您将得到一个包含一个值和两个'DEFAULT's 的列表。无论如何,尝试:

out = [i[key] for i in lis_dic if key in i] or ['DEFAULT']
于 2013-07-04T18:41:00.180 回答
1

除非您对数据结构有限制,否则最简单的解决方案是将其转换一次,这样每次都可以轻松检索所需的信息。这也可能更有效,具体取决于您实际在做什么。

转换后的数据结构如下所示:

transformed_lis_dic = {
    1: ['One', 'Ichi', 'Eins'], 
    2: ['Two', 'Ni', 'Zvi'],
    3: ['Three', 'San', 'Dri']
}

out = transformed_lis_dic.get(key, ['DEFAULT'])

您可以通过以下方式进行转换:

from collections import defaultdict

transformed_lis_dic = defaultdict(list)
for dic in lis_dic:
    for key, val in dic.iteritems():
        transformed_lis_dic[key].append(val)
于 2013-07-04T19:19:04.720 回答
0

您可以创建自己的函数并完全获取所有键,或者只返回一个默认值 - 例如:

lis_dic = [{1:'One',2:'Two',3:'Three'},
    {1:'Ichi',2:'Ni',3:'San'},
    {1:'Eins',2:'Zvi',3:'Dri'}]

from operator import itemgetter
def single(key, *dicts, **kwargs):
    default = kwargs.get('default', 'DEFAULT')
    try:
        return map(itemgetter(key), dicts)
    except KeyError:
        return default

print single(3, *lis_dic)
# ['Three', 'San', 'Dri']
print single(4, *lis_dic)
# DEFAULT
于 2013-07-04T18:41:03.730 回答