计算在python中满足某些条件的连续出现的数字

时间:2011-08-24 11:40:44

标签: python

我有一个特定的数据集,如

array([   2.1,    3. ,  179.1,    1.9,    2.6,  425.8,    1.7,    3.1,
          4. ,  144. ,    2.2,    2.3,    5.3,  135.5,    2. ,    2.7,
      .....])]

这里我想计算连续出现的数字低于6并将它们保存在特定的计数器中。例如,在前三个数字中,有两个数字在出现较大数字之前连续低于6。因此,counter2会增加1.如果三个数字连续出现,那么counter3将增加1(如第二行),依此类推。是否有任何功能在python中执行,如果不是我如何继续?提前致谢。

4 个答案:

答案 0 :(得分:3)

根据我对您的问题的理解,这是我的解决方案:

from collections import defaultdict

def countSuccessive(data):
    counters = defaultdict(int)
    count = 0

    for i in data:
        if i < 6:
            count += 1
        elif count != 0:
            counters[count] += 1
            count = 0

    if count != 0:
        counters[count] += 1

    return counters

result = countSuccessive([
    2.1,    3. ,  179.1,    1.9,    2.6,  425.8,    1.7,    3.1,
    4. ,  144. ,    2.2,    2.3,    5.3,  135.5,    2. ,    2.7])

print repr(result)

输出:

defaultdict(<type 'int'>, {2: 3, 3: 2})

在这种情况下,计数器为result[2]result[3]。您可以检查字典以查看存在哪些密钥。

答案 1 :(得分:2)

import numpy as np
import itertools as it

a = np.array([   2.1,    3. ,  179.1,    1.9,
                 2.6,  425.8,    1.7,    3.1,
                 4. ,  144. ,    2.2,    2.3,
                 5.3,  135.5,    2. ,    2.7])

counters = {}
for grp in (len(list(n)) for t,n in it.groupby(a>6) if not t):
    counters[grp] = counters.get(grp, 0) + 1

# counters: {2: 3, 3: 2}, i.e. counter2 = 3, counter3 = 2

或者,如果您只想要counter2变量:

counter2 = sum(1 for t,n in it.groupby(a>6) if not t and len(list(n)) == 2)

答案 2 :(得分:1)

这可能有用。

def f(data):
    counters = {}
    succ = 0
    for item in data:
        if item < 6:
            succ += 1
        elif succ > 0:
            try:
                counters[succ] += 1
            except KeyError:
                counters[succ] = 1
            succ = 0
    if succ > 0:
        try:
            counters[succ] += 1
        except KeyError:
            counters[succ] = 1        
    return counters

它返回一个字典,其中键是连续数字小于6的数字,值是这样的出现次数。我可能不太了解它。如果是这样,请纠正我。

编辑:同时cdhowie发布了类似的答案,摆脱了try / except。

答案 3 :(得分:1)

我的解决方案

from collections import Counter
from itertools import groupby

l = [2.1, 3., 179.1, 1.9, 2.6, 425.8, 1.7, 3.1,
     4.,  144., 2.2, 2.3, 5.3, 135.5, 2., 2.7]

lengths = [len(list(g)) for (k, g) in groupby(l, key = lambda x: x < 6) if k]
print Counter(lengths)

如果您没有具有Counter类的Python 2.7,则可以使用defaultdict:

d = defaultdict(int)
for el in lengths: 
    d[el] += 1
print d