1

我正在尝试通过执行以下操作从字典列表中获取所有值(对应于特定键的值除外):

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}...]

我知道 dict 没有固有的顺序。但是我的列表 fv 需要按顺序排列这些值。我正在考虑对键上的字典进行排序,然后做我刚刚做的事情。但这能保证有效吗?

我知道 usingOrderedDict是一种选择,但与 dict 相比,它的性能似乎也较差,这对我来说是一个问题,因为我的字典通常会包含大量数据。

更新:当我说我需要按顺序排列值时,它们实际上并不需要排序。我的意思是我需要能够每次都以固定的确定顺序检索值列表。在上面的示例中,我总是想得到 [[0.2,0.3],[0.9,0.4]] 尽管它本身可能不是排序顺序。排序将强制执行一个确定性顺序。我真正关心的是保持值在最终列表中的位置。例如 yKey 的值必须始终是每个列表中的第一个值,zKey 的值必须始终是每个列表中的第二个值依此类推,即使 ykey、zkey 等可能在字典中的任何顺序。

4

2 回答 2

3

如果您知道您的 dicts 可能包含的可能键列表,则以下解决方案可能对您有用:

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如果所有 dicts 都包含相同的键集,则可以删除该部分。

于 2012-02-09T21:47:22.133 回答
2

通常的练习是这样的。

  1. 将您的字典构建为字典。速度非常好。

  2. 在极少数情况下,当您需要密钥才能执行以下两项操作之一时:

    • 将整个事物转换为 OrderedDict

    • 对键进行排序。 for k in sorted( some_dict.keys() ):

    选择是分摊成本之一。如果您正在做一件事,请排序。如果您正在做几件事,请构建一个 OrderedDict。

  3. 在值必须按某种顺序排列的非常非常罕见的情况下,请执行此操作。

    ordered_values = list( sorted( some_dictionary.values() ) )
    
于 2012-02-09T21:33:51.357 回答