【问题标题】:Iterate over a dict, compare current and previous value遍历一个字典,比较当前值和以前的值
【发布时间】:2017-11-25 22:50:38
【问题描述】:

所以,这让我有点难过。我有一个我试图迭代的字典,我正在寻找峰值。概念在这里:

out = {}
for i in data.keys():
    if(data[i].next() -2 > data[i]:
        out.update(i, data[i])

我已尝试将其放入 list(range(len(data))) 并通过这种方式进行迭代,这适用于虚拟数据。但是我的数据没有像 1、2、3、4 这样的键。示例数据:

{ 29600: 0.65867825014992798,
 30000: 1.3958743297851659,
 30400: 2.1166100767879361,
 30800: 2.0297784488567414,
 31200: 1.9480822174184762,
 31600: 1.887373119058025,
 32000: 1.8890589139490572,
 32400: 4.1795916676025842,
 32800: 3.828821494194075,
 33200: 3.7060572197219459,
 33600: 3.647037270729065,
 34000: 3.6029200898094329,
 34400: 3.5352886422138452,
 34800: 6.7902577064444039,
 35200: 6.5199005963210857,

数据中有一些点,其中值增加了一个很大的值(大约 3),我试图找到与这些点关联的索引和值。因此,我使用下一个值 - 2 并查看它是否仍大于前一个值作为我的检查。如果这样更容易的话,这个 dict 可以很容易地成为 pandas 数据系列。

【问题讨论】:

  • 你能在你的例子中给出峰值吗?
  • 请记住,除非您创建 OrderedDict,否则不会对字典进行排序。因此,像您现在依靠“下一个”值作为某个数字一样进行迭代并不总是有效。
  • 我添加了更好的示例数据,@Tbaki,但这根本不起作用,我无法遍历数据。
  • @NickHale 你只想要最大键/值?
  • 不只是最大值,数据非常大,分步进行。我正在寻找步骤点的键/值

标签: python pandas numpy dictionary


【解决方案1】:

您可以按排序顺序保留键列表,然后使用它来迭代字典:

data = { 29600: 0.65867825014992798,
         30000: 1.3958743297851659,
         30400: 2.1166100767879361,
         30800: 2.0297784488567414,
         31200: 1.9480822174184762,
         31600: 1.887373119058025,
         32000: 1.8890589139490572,
         32400: 4.1795916676025842,
         32800: 3.828821494194075,
         33200: 3.7060572197219459,
         33600: 3.647037270729065,
         34000: 3.6029200898094329,
         34400: 3.5352886422138452,
         34800: 6.7902577064444039,
         35200: 6.5199005963210857}

out = {}
# keep the keys in sorted order
sorted_keys = sorted(data)

# now for each key in the list
for i in range(len(sorted_keys)-1):

    # get key at index i and key at index i+1 and compare them
    if(data[sorted_keys[i+1]] -2 > data[sorted_keys[i]]):

        # if condition matched update the out 
        out[sorted_keys[i]] = data[sorted_keys[i]]
        out[sorted_keys[i+1]] = data[sorted_keys[i+1]]

print(out)

输出:

{32000: 1.8890589139490572,
 32400: 4.179591667602584,
 34400: 3.535288642213845,
 34800: 6.790257706444404}

【讨论】:

  • 太好了,我不知道sorted()
【解决方案2】:

使用数据框,因为你对熊猫没问题:

输入

    k       v
0   29600   0.658678250149928
1   30000   1.395874329785166
2   30400   2.116610076787936
3   30800   2.0297784488567414
4   31200   1.948082217418476
5   31600   1.887373119058025
6   32000   1.8890589139490568
7   32400   4.179591667602584
8   32800   3.8288214941940755
9   33200   3.7060572197219455
10  33600   3.647037270729065
11  34000   3.602920089809433
12  34400   3.5352886422138448
13  34800   6.790257706444404
14  35200   6.519900596321086


d["new"] = d.v - d.v.shift(-1)
d["new"] = d["new"].apply(lambda x:abs(x))
d[d["new"] >2]

输出

    k       v                   new
6   32000   1.8890589139490568  2.2905327536535274
12  34400   3.5352886422138448  3.254969064230559

【讨论】:

  • 这对我有用,很好的答案,不过我只能接受一个!
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 2020-12-06
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多