如何比较python中的一对值,看下一个值是否大于前一个值?

How to compare a pair of values in python, to see if the next value in pair is greater than the previous?

我有以下列表:

每对值都为我提供了有关特定行的信息。我希望能够将第一个位置的值与下一个位置的值进行比较,看看下一个值是否小于当前值,如果保持这种状态,则删除该对。因此,例如,对于第一个索引 0 和 1,比较 29 和 25,我看到 25 小于 29,所以我保留这对,现在我将 2 添加到当前索引,带我到 16 这里我看到 16 是不少于 19,所以我删除了对值 (16,19)。我有以下代码:

curr = 0
skip = 0
finapS = []

while curr < len(apS):
    if distance1[apS[skip+1]] < distance1[apS[skip]]:
        print("its less than prev")
        print(curr,skip)
        finapS.append(distance1[apS[skip]])
        finapS.append(distance1[apS[skip+1]])
        skip = skip + 2
        curr = curr + 1
        print("itterated,", skip, curr)

distance1 是具有不同数据点的值列表。 apS 是一个列表,其中包含 distance1 列表中重要值的索引。 Distance1 具有所有值,但我只需要 apS 索引中的值,现在我需要查看这些对及其值是否按降序排列。我试过的代码 运行 给了我无限循环我不明白为什么。在这里,我将值添加到新列表中,但如果可能的话,我只想删除这些值对并保留原始列表。

如果你的测试是错误的,你就循环而不增加计数器电流。
你需要一个

else: 
  curr+=1

(或者按逻辑+=2
在列表中前进。

我认为使用生成器更容易完成这种逻辑。您可以遍历数据并仅在满足您的条件时产生值。例如

def filter_pairs(data):
    try:
        it = iter(data)
        while True:
            a, b = next(it), next(it)
            if b < a:
                yield from (a, b)
    except StopIteration:
        pass

用法示例:

>>> aps = [1, 2, 3, 1, 2, 4, 6, 5]
>>> finaps = list(filter_pairs(aps))
>>> finaps
[3, 1, 6, 5]

纯 Python 来说,我认为 zip 是结合切片步骤的优雅方式。

假设您的列表定义为::

>>> a = [29, 25, 16, 19, 14, 12, 22, 8, 26, 25, 26]

您可以将列表压缩到自身中,移位为 1,切片步长为 2::

>>> list(zip(a[:-1:2], a[1::2]))
[(29, 25), (16, 19), (14, 12), (22, 8), (26, 25)]

一旦你有了它,你就可以将序列过滤到你想要的项目,你的完整解决方案将是::

>>> list((x, y) for (x, y) in zip(a[:-1:2], a[1::2]) if x > y)
[(29, 25), (14, 12), (22, 8), (26, 25)]

如果您更喜欢使用 numpy 路径,请阅读 np.shift 函数。

看来您需要一个新列表。因此:

apS = [29.12, 25.01, 16.39, 19.49, 14.24, 12.06]
apS_new = []
for x, y in zip(apS[::2], apS[1::2]):
    if x > y:
        apS_new.extend([x, y])
print(apS_new)

输出:

[29.12, 25.01, 14.24, 12.06]