提取Python字典到列表时值的顺序
我想从一个字典列表中获取所有值(除了某个特定键对应的值),我这样做:
fv = [[v for (k,v) in d.iteritems() if k is not 'xKey'] for d in someDict]
其中 someDict
的结构是这样的:
[{xKey:0.1,yKey:0.2,zKey:0.3},{yKey:0.9,xKey:0.7,zKey:0.4}...]
我知道字典本身没有固定的顺序。但是我的列表需要保持值的顺序。我在考虑先根据键对字典进行排序,然后再执行我刚才做的操作。但这样做能保证有效吗?
我知道使用 OrderedDict
是一个选择,但它的性能似乎比普通字典差,这对我来说是个问题,因为我的字典通常会包含大量数据。
更新:当我说我需要值有顺序时,它们并不一定要是排序的。我的意思是我需要每次都能以固定的确定性顺序获取值列表。在上面的例子中,我总是想得到 [[0.2,0.3],[0.9,0.4]],尽管这可能不是一个排序的顺序。排序会强制执行一种确定的顺序。我真正关心的是在最终列表中保持值的位置。例如,yKey 的值必须始终是每个列表中的第一个值,zKey 的值必须始终是每个列表中的第二个值,依此类推,即使 yKey、zKey 等在字典中的顺序可能是任意的。
2 个回答
2
通常的步骤是这样的。
先把你的字典建立成一个普通的字典(dict)。这样速度非常快。
如果你很少需要按顺序使用键,可以选择以下两种方法之一:
把整个字典转换成一个有序字典(OrderedDict)。
对键进行排序。可以用这个代码:
for k in sorted( some_dict.keys() ):
选择哪种方法取决于排序的成本。如果你只需要做一件事,那就排序。如果你需要做几件事,那就建立一个有序字典。
在非常非常少见的情况下,如果值也必须按某种顺序排列,可以这样做。
ordered_values = list( sorted( some_dictionary.values() ) )
3
如果你知道你的字典可能包含哪些键,下面这个方法可能对你有用:
allkeys = ... # might be known; or obtained from available dicts by union;
# 'xKey' can be removed at this stage to simplify the list
# comprehension that follows
sortedKeys = sorted(allKeys)
list_of_values = [[d.get(k) for k in sortedKeys if k in d]
for d in list_of_dicts]
不过,这个方法可能比iteritems
要慢一些。如果所有的字典都包含相同的键,你可以去掉if k in d
这一部分。