缩短列入嵌套字典的列表理解

时间:2014-03-06 18:42:19

标签: python python-2.7 dictionary list-comprehension

下面的列表理解给出了所需的输出,但它似乎有点长,因为我必须专门引用子字典中的每个值,因为每个主键的值是另一个字典。有没有办法让我的列表理解更短,仍然提供相同的输出?如果可能的话,我正在寻找单线解决方案。

myDict = {'pKey_b': {'val3': 'vb3', 'val1': 'vb1', 'val4': 'vb4', 'val2': 'vb2'}, 'pKey_a': {'val3': 'va3', 'val1': 'va1', 'val4': 'va4', 'val2': 'va2'}, 'pKey_e': {'val3': 've3', 'val1': 've1', 'val4': 've4', 'val2': 've2'}, 'pKey_d': {'val3': 'vd3', 'val1': 'vd1', 'val4': 'vd4', 'val2': 'vd2'}, 'pKey_c': {'val3': 'vc3', 'val1': 'vc1', 'val4': 'vc4', 'val2': 'vc2'}}

myListComp = sorted(sorted([k, v.values()[0], v.values()[1], v.values()[2], v.values()[3]]) for k, v in myDict.items())

print myListComp
'''
[
['pKey_a', 'va1', 'va2', 'va3', 'va4'],
['pKey_b', 'vb1', 'vb2', 'vb3', 'vb4'],
['pKey_c', 'vc1', 'vc2', 'vc3', 'vc4'],
['pKey_d', 'vd1', 'vd2', 'vd3', 'vd4'],
['pKey_e', 've1', 've2', 've3', 've4']
]
'''

3 个答案:

答案 0 :(得分:2)

如何在DSM v#39建议的基础上采用另一种方式:

result = [[k] + map(myDict[k].get, sorted(v)) for k, v in sorted(myDict.iteritems())]

答案 1 :(得分:2)

怎么样:

>>> lc = sorted(sorted([k] + sorted(v.values()) for k,v in myDict.items()))
>>> for row in lc:
...     print row
...     
['pKey_a', 'va1', 'va2', 'va3', 'va4']
['pKey_b', 'vb1', 'vb2', 'vb3', 'vb4']
['pKey_c', 'vc1', 'vc2', 'vc3', 'vc4']
['pKey_d', 'vd1', 'vd2', 'vd3', 'vd4']
['pKey_e', 've1', 've2', 've3', 've4']

虽然你可能也想要

>>> lc = sorted(sorted([k] + [v[x] for x in sorted(v)] for k,v in myDict.items()))
>>> for row in lc:
...     print row
...     
['pKey_a', 'va1', 'va2', 'va3', 'va4']
['pKey_b', 'vb1', 'vb2', 'vb3', 'vb4']
['pKey_c', 'vc1', 'vc2', 'vc3', 'vc4']
['pKey_d', 'vd1', 'vd2', 'vd3', 'vd4']
['pKey_e', 've1', 've2', 've3', 've4']

取决于您是希望值以的排序顺序显示,还是按相应排序的的顺序显示。在这里他们都是一样的。

请注意,在原始代码中,键不需要显示为第一个元素,因为排序可能会将它们与值混合;我确保他们保持第一。

答案 2 :(得分:1)

来自help(dict.values)

values(...)
    D.values() -> list of D's values

知道dict.values()会返回list(而不是tuple),您可以简化列表理解:

myList = sorted([k] + sorted(v.values()) for k, v in myDict.items())

如果稍后您意识到您只需要v.values()上的前四个元素,请将其切片为v.values()[:4]