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

问题描述 投票:0回答:4

我有以下清单:

每对值都提供有关特定行的信息。我希望能够比较第一个位置和下一个位置的值,看看下一个值是否小于当前值,如果保持这种状态,如果不删除该对。例如,对于第一个索引 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("iterated,", skip, curr)

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

python algorithm sorting
4个回答
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]

2
投票

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

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]

1
投票

就纯 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
函数。


1
投票

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

else: 
  curr+=1

(或根据逻辑

+=2

继续浏览列表。

© www.soinside.com 2019 - 2024. All rights reserved.