【问题标题】:Splitting data into dictionaries将数据拆分为字典
【发布时间】:2015-04-04 10:46:34
【问题描述】:

我有一个长列表值,如下所示,我正在考虑将其转换为字典。我想在 python 中创建字典,其中对于每个键 0、1、2,...(比如 n),值是属于该键的所有值的总和。例如,

0 -29.8568331501
1 -27.4866699437
2 -27.1228643508
0 -10.8685684486
1 -9.41353774283
2 -10.3218886291
...

那么,

dict = {0: SUM(-29.8568331501+-10.8685684486+..), 1:SUM(-27.4866699437+-9.41353774283+..), 2:1:SUM(-27.1228643508+-10.3218886291+..)}

我是一个 python 新手,希望能提供有关如何执行此操作的任何指导。

【问题讨论】:

  • 是文件中的数据吗?
  • 不,我是通过计算生成这些数据,而不是从文件中读取它
  • 数据看起来不像我以前见过的任何格式,它到底存储的是什么?
  • 它没有被存储,这是我在一个循环中编写的 def 函数中进行计算的结果,该循环正在生成像 0,1,2,0,1,2,01,2 这样的序列....

标签: python dictionary


【解决方案1】:

好的,有两件事:

  1. 如果您的键实际上是 1...N,则不要使用字典而是使用简单列表。
  2. 带有字典的解决方案,为了清楚起见,我称之为dictionary。 1...N 是keys,您的浮点数是values:

    如果键在字典中: 字典[键] += 其他值: 字典[键] = 值

您需要将其应用于每个 key, value 对。

【讨论】:

    【解决方案2】:

    您可以使用如下所述的字典理解:

    Mapping Over Values

    tmpDict = {k: f(k,v) for k, v in tmp.items()}
    

    f(k,v) 替换为执行求和的函数。

    例子:

    生成数据

    tmp = {}
    
    for i in range(0, 10):
        tmp [i] = [i for x in range(0, 10)]
    

    {0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], 2: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 3: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 4: [4, 4, 4, 4, 4, 4, 4, 4, 4, 4], 5: [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], 6: [6, 6, 6, 6, 6, 6, 6, 6, 6, 6], 7: [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], 8: [8 , 8, 8, 8, 8, 8, 8, 8, 8, 8], 9: [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]}

    执行分桶求和

    tmpDict = {k: sum(v) for k, v in tmp.items()}
    

    结果集:

    {0:0、1:10、2:20、3:30、4:40、5:50、6:60、7:70、8:80、9:90}

    【讨论】:

    • 这有什么帮助? tmp 必须是一个 dict(什么?),函数 f 需要具有全局状态来跟踪总和,这有效地消除了对字典理解的需要。似乎 1 个问题已被 3 个取代。
    • @jepio 函数f 旨在成为sum 操作的占位符。
    • 我同意,如果您的数据格式与您的 tmp 字典相同,那么使用 sum 的 dict 理解是最简单的解决方案。但首先您需要将数据转换为这种格式。对于问题中的数据,我想出了以下内容:data.sort(key=operator.itemgetter(0)); b = {k: sum(v for _, v in vals) for k, vals in itertools.groupby(data, itemgetter(0))} 我不会说这是一个特别简单的解决方案...
    • 这是一个公平的评估;存储为字典,字典理解是要走的路。我不知道您如何存储上述数据。 (例如){1:1,1:2,1:3} 产生 {1:3} - 我会问 OP。
    【解决方案3】:

    因此,假设您已经将数据读入列表(或正在使用生成器),您确实可以通过非常简单的方式做到这一点:

    from collections import defaultdict
    
    sums = defaultdict(float)
    for key, val in data:
        sums[key] += val
    

    我建议您熟悉collections 模块,因为它有很多正确的工具可以用于许多工作。在这种情况下,defaultdict 就像一个普通的 python 字典,但它有一个尚未包含在其中的键的默认值(在这种情况下,默认值是 float() 的值,即0.0)。多亏了这一点,您无需费心检查字典中是否已存在密钥。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多