在Python中从嵌套字典中提取键

时间:2016-02-05 09:26:06

标签: python dictionary lambda key reduce

我正在尝试编写一个单行程序来从python中的2级嵌套字典中提取密钥。

以下是我的数据示例:

values = [(u'Andy', OrderedDict([(u'en', 102)])), (u'Ben', OrderedDict([(u'es', 1)])), (u'Jane', OrderedDict([(u'EN', 719), (u'en', 969)])), (u'Steve', OrderedDict([(u'fr', 1)])), (u'Susanne', OrderedDict([(u'nl', 2)]))]

预期结果将是:

[u'en', u'es', u'EN', u'fr', u'nl']

到目前为止,我已经尝试过:

map(lambda x: x[1].keys(), values.items())
AttributeError: 'unicode' object has no attribute 'keys'

reduce(lambda k, v: v.keys(), values.items())
AttributeError: 'tuple' object has no attribute 'keys'

这需要是一个单行,因为我在Jinja模板中插入代码,因此我正在尝试使用lambda。我对Python很陌生,也许我误解了一些东西......?

3 个答案:

答案 0 :(得分:1)

items不是字典,它是没有itertools.chain.from_iterable属性的列表。这是>>> list(set(chain.from_iterable(x[1].keys() for x in values))) [u'fr', u'en', u'nl', u'es', u'EN'] 的一个解决方案:

String decimal = "([0-9]+(\\.[0-9]+)?[/-]?)+";
String units = "(in|ft)\\.?";
String unitName = "(cu\\.? *ft|gauge|watt|rpm|ft|lbs|K|GPF|btu|mph|cfm|volt|oz|pounds|dbi|miles|amp|hour|kw|f|degrees|year)";

    sizePattern.add(Pattern.compile("(?i)" + decimal + " *" + units + " *x? *" + decimal + " *" + units + " *x? *" + decimal + " *" + units + ""));
    sizePattern.add(Pattern.compile("(?i)" + decimal + " *" + units + " *x? *" + decimal + " *" + units));
    sizePattern.add(Pattern.compile("(?i)" + decimal + " *x *" + decimal + " *" + units));
    sizePattern.add(Pattern.compile("(?i)" + decimal + "( *" + units + ")"));
    sizePattern.add(Pattern.compile("(?i)" + decimal + "( *sq?\\.?)( *ft?\\.?)"));
    sizePattern.add(Pattern.compile("(?i)" + decimal + " *" + unitName));
    sizePattern.add(Pattern.compile("(?i)" + decimal + "(d)"));
    sizePattern.add(Pattern.compile("(?i)" + decimal + "( *(%|percent))"));
    sizePattern.add(Pattern.compile("(?i)" + decimal));

    for (Pattern p : sizePattern)
    {
        ODebug.Write(Level.FINER, "PRD-0079: Using pattern = " + p.pattern());

        m = p.matcher(_data);
        while (m.find()) 
        {
            ODebug.Write(Level.FINER, "           Got => [" + m.group(0) + "]");
            this.Dimensions.add(m.group(0));

            _data = _data.replaceAll("\\Q" + m.group(0) + "\\E", ".");
            m = p.matcher(_data);
        }
    }

答案 1 :(得分:0)

试试这个 -

In [10]: reduce(lambda x,y:x+y ,map(lambda x:x[1].keys(), values))
Out[10]: [u'en', u'es', u'EN', u'en', u'fr', u'nl']

map从字典中获取所有键 reduce用于组合嵌套列表的结果。

如果您需要唯一值(销毁订单),请使用set -

In [11]: list(set(reduce(lambda x,y:x+y ,map(lambda x:x[1].keys(), values))))
Out[11]: [u'fr', u'en', u'nl', u'es', u'EN']

答案 2 :(得分:0)

另一种解决方案

list(set([y for x in values for y in x[1].keys()]))