提取Python字典到列表时值的顺序

2 投票
2 回答
9089 浏览
提问于 2025-04-17 12:43

我想从一个字典列表中获取所有值(除了某个特定键对应的值),我这样做:

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

通常的步骤是这样的。

  1. 先把你的字典建立成一个普通的字典(dict)。这样速度非常快。

  2. 如果你很少需要按顺序使用键,可以选择以下两种方法之一:

    • 把整个字典转换成一个有序字典(OrderedDict)。

    • 对键进行排序。可以用这个代码:for k in sorted( some_dict.keys() ):

    选择哪种方法取决于排序的成本。如果你只需要做一件事,那就排序。如果你需要做几件事,那就建立一个有序字典。

  3. 在非常非常少见的情况下,如果值也必须按某种顺序排列,可以这样做。

    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这一部分。

撰写回答