单个失败结果形成三元运算符,在列表中理解python中的字典列表

时间:2013-07-04 18:32:45

标签: python list dictionary list-comprehension conditional-operator

以下是我要看的问题:列出一个词典列表。在此内部,您可以看到有效和无效结果的明显情况。因此,您在列表解析中编写一个简单的三元运算符,以便在失败时输出默认消息。但是,它为每次失败提供了默认值。

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

此示例代码中的目标是,如果密钥不在列表中的字典中,则表示具有'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 ]))

3 个答案:

答案 0 :(得分:2)

密钥不在三个字典中的任何一个中,因此'DEFAULT'值生成三次。如果第一个字典保存了值而另外两个字体没有,那么您将得到一个包含一个值和两个'DEFAULT'的列表。无论如何,试试:

out = [i[key] for i in lis_dic if key in i] or ['DEFAULT']

答案 1 :(得分: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)

答案 2 :(得分: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