如何比较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]
我有以下列表:
每对值都为我提供了有关特定行的信息。我希望能够将第一个位置的值与下一个位置的值进行比较,看看下一个值是否小于当前值,如果保持这种状态,则删除该对。因此,例如,对于第一个索引 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]