从Python

时间:2016-06-27 14:17:02

标签: python json parsing dictionary list-comprehension

在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,我可以使用MapTable迭代字典列表(并不重要),并为每个字典提取我想要的两个键包含此代码的列表(其中dicts表示dicts列表):

#[['k', {'p', 'q'}]]& /@ dicts(在Mathematica中,您使用[[]]进行索引,因为[]用于函数调用。)

截至目前,在Python中我使用以下代码

[(d['k']['p'], d['k']['q'])) for d in dicts]

然而,除了略微违反DRY(我是一个DRY坚果),使用完整的密钥名称,这超过了PEP 8的79个字符的行限制。我只是想知道是否有更好的方法来解决这个问题。

感谢。

编辑:请参阅关于...

的词典格式的行

4 个答案:

答案 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]