用平均值代替攀登顺序

时间:2020-02-06 22:15:04

标签: python list

我有一个像这样的随机列表

X = [0, 1, 5, 6, 7, 10, 15]

,并且需要查找并替换每个攀登序列的平均值。 最后应该看起来像这样:

X = [0, 6, 10, 15]       #the 0 and 1 to 0; and the 5,6,7 to 6

我试图通过从第一个值中减去第二个值来找到序列,如下所示:

y = 0
z = []
while X[y +1] -X[y] == 1: 
            z.append(X[y])

            y = y +1

现在我不知道如何删除例如5,6和7并将其替换为平均值6。

4 个答案:

答案 0 :(得分:3)

您可以将列表上的itertools.groupby与键功能一起使用,该功能通过递增计数器返回每个项目的差额:

from itertools import groupby, count
from statistics import mean

X = [0, 1, 5, 6, 7, 10, 15]
c = count()
X = [int(mean(g)) for _, g in groupby(X, key=lambda i: i - next(c))]

X变为:

[0, 6, 10, 15]

答案 1 :(得分:1)

您可以对每个攀登序列进行迭代和分组,然后取平均值。

wait.until(ExpectedConditions.AlertIsPresent());
driver.switchTo().alert().dismiss();

答案 2 :(得分:0)

这是一种入门技巧:创建一个新列表,该列表就是列表中相邻元素的区别:

diff = [X[i] - X[i-1] for i in range(1, len(X)) ]

还有更多的“ Pythonic”方式可以做到这一点,但是我想确保新的程序员可以使用它。

您现在将diff作为

[1, 4, 1, 1, 3, 5]

1中有一个diff的地方,在X中有一个攀岩对。遍历diff以找到1值的序列。在找到该位置的地方,取与slice值对应的X中的1。该切片的中间元素是您的平均值。

如果值不是1,则只需像往常一样取X的相应元素即可。

appendz的标识值,您将获得理想的结果。

你能从那里拿走吗?

答案 3 :(得分:0)

不是真的要回答这个问题,这是一个非常基本的CS 101问题,人们应该尝试弄清楚自己,但是我注意到@blhsing的好答案是它看起来很慢。我发现mean()的运行速度非常慢!

from itertools import groupby, count
from statistics import mean
from timeit import timeit


def generate_1step_seq1(xs):
    result = []
    n = 0
    while n < len(xs):
        # sequences with step of 1 only
        if not result or xs[n] == result[-1] + 1:
            result += [xs[n]]
        else:
            # int result, rounding down
            yield sum(result) // len(result)
            result = [xs[n]]
        n += 1
    if result:
        yield sum(result) // len(result)


def generate_1step_seq2(xs):
    c = count()
    return [int(sum(xs) // len(xs)) for xs in [list(g) for _, g in groupby(xs, key=lambda i: i - next(c))]]


def generate_1step_seq3(xs):
    c = count()
    return [int(mean(g)) for _, g in groupby(xs, key=lambda i: i - next(c))]


values = [0, 1, 5, 6, 7, 10, 15]

print(list(generate_1step_seq1(values)))
print(generate_1step_seq2(values))
print(generate_1step_seq3(values))

print(timeit(lambda: list(generate_1step_seq1(values)), number=10000))
print(timeit(lambda: list(generate_1step_seq2(values)), number=10000))
print(timeit(lambda: list(generate_1step_seq3(values)), number=10000))

最初,我认为这可能是由于列表很小,但是即使对于大型列表,mean()的运行速度也非常慢。有人碰巧知道为什么吗?由于statistics _sum的非常安全的性质而出现,因此它试图避免float舍入错误?