我有以下清单:
每对值都提供有关特定行的信息。我希望能够比较第一个位置和下一个位置的值,看看下一个值是否小于当前值,如果保持这种状态,如果不删除该对。例如,对于第一个索引 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 索引中的值,现在我需要查看这些对及其值是否按降序排列。我尝试运行的代码给了我无限循环,我不明白为什么。在这里,我将值添加到新列表中,但如果可能的话,我想删除这些值对并保留原始列表。
我认为使用生成器更容易完成这种逻辑。您可以循环遍历数据,并且仅在满足您的条件时才产生值。例如
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]
看来您需要一个新列表。因此:
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]
就纯 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
函数。
如果你的测试是假的,你会循环而不增加计数器电流。
你需要一个
else:
curr+=1
(或根据逻辑
+=2
)