在Python(2.7)中,我正在解析一个字典列表(来自JSON),其中每个字典都具有以下格式(我使用假密钥名称):
{'k': {'p': value_i_care_about_1, 'q': value_i_care_about_2, ... (stuff I don't want)}, ... (stuff I don't want)}
其中...
表示我不关心的键值对(不想要)。
我需要将其解析为元组列表,其中每个元组具有以下格式:
(value_i_care_about_1, value_i_care_about_2)
如果这是Mathematica,我可以使用Map
或Table
迭代字典列表(并不重要),并为每个字典提取我想要的两个键包含此代码的列表(其中dicts
表示dicts列表):
#[['k', {'p', 'q'}]]& /@ dicts
(在Mathematica中,您使用[[]]
进行索引,因为[]
用于函数调用。)
截至目前,在Python中我使用以下代码
[(d['k']['p'], d['k']['q'])) for d in dicts]
然而,除了略微违反DRY(我是一个DRY坚果),使用完整的密钥名称,这超过了PEP 8的79个字符的行限制。我只是想知道是否有更好的方法来解决这个问题。
感谢。
编辑:请参阅关于...
答案 0 :(得分:1)
我知道这个时间更长,但它具有相对清晰且可扩展的优点。
# you can add any combination of fields here
fields = [['k', 'p'],
['k', 'q']]
result = [tuple(d[level1][level2] for level1, level2 in fields)
for d in dicts]
答案 1 :(得分:0)
如果p和q的排序不重要,并且k在所有dicts中都是常数(为了缩短线):
key = 'k'
[(d[key].values()) for d in dicts]
如果元组中的顺序确实重要,那么你必须按照自己的方式进行,但如果名称再次保持不变,你可以将其拆分以缩短这一行:
key = 'k'
key1, key2 = 'text of p', 'text of q'
如果需要顺序,这个对顶级的双重引用是不可避免的,因为python词典是无序的。
答案 2 :(得分:0)
如果我理解正确,你正在寻找一个' Pythonic'如何获得每个' k'内在价值清单 因此,为此您可能希望使用以下代码,它不依赖于给定的键/键:
json = {'k1': {'p': 'value_i_care_about_1', 'q': 'value_i_care_about_2'},
'k2':{'p': 'value_i_care_about_3', 'q': 'value_i_care_about_4'}}
l = {k: [y for (x,y) in v.items()] for (k,v) in json.items()}
print (l['k1'])
print (l['k2'])
输出:
[' value_i_care_about_1',' value_i_care_about_2']
[' value_i_care_about_3',' value_i_care_about_4']
答案 3 :(得分:0)
您可以使用此嵌套列表理解来干掉:
result = [tuple(dd[k1][k2] for k1 in ['k'] for k2 in ['p','q']) for dd in dictlist]