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