【问题标题】:Order of values when extracting Python dict to list将 Python dict 提取到列表时的值顺序
【发布时间】:2012-02-09 21:29:06
【问题描述】:

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

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 需要按顺序排列这些值。我正在考虑对键上的字典进行排序,然后做我刚刚做的事情。但这能保证有效吗?

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

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

【问题讨论】:

  • 我会使用OrderedDict,然后测量速度,看看性能是否有问题。如果没有相关领域的丰富经验,通常很难预测性能。
  • 我同意,尽管字典会随着时间的推移而变大,我知道我们可能不应该修复它,如果它没有损坏,但我不想一周后重温。
  • "一个固定的确定性顺序......它本身可能不是一个排序的顺序" 你不能有一个未指定但确定性的顺序。这只是要求下一个版本的问题具有不同的未指定的确定性顺序。请做出一个有限的、明确的、有效的陈述。希望的功能不会很好地发挥作用。
  • 你到底想通过从字典中获取这些数据来完成什么?这似乎是一个奇怪的要求......
  • @KarlKnechtel:好点。例如,如果要点是两个有两个“并行”字典,那么让一个字典为每个键有两个值会更聪明。

标签: python dictionary ordereddictionary


【解决方案1】:

如果您知道您的 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 如果所有字典都包含相同的键集,则可以删除。

【讨论】:

    【解决方案2】:

    通常的练习是这样的。

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

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

      • 将整个事物转换为 OrderedDict

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

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

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

      ordered_values = list( sorted( some_dictionary.values() ) )
      

    【讨论】:

    • 只是我,还是他要求排序的
    • “顺序。我真正关心的是保持值在最终列表中的位置。”。所以。目前尚不清楚是键 必须 排序以保证确定性顺序,还是值 必须 排序以保证确定性顺序。我投票给键,因为它更简单。这个问题当然不清楚。
    • 您的第 3 部分似乎对我不起作用?这是我需要的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2021-02-04
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多