我正在尝试编写一个单行程序来从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很陌生,也许我误解了一些东西......?
答案 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()]))