我有一个像这样的随机列表
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。
答案 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
的相应元素即可。
append
到z
的标识值,您将获得理想的结果。
你能从那里拿走吗?
答案 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
舍入错误?