删除列表中彼此接近的数字

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

我有一个像

这样的列表
mylist = [75,75,76,77,78,79,154,155,154,156,260,262,263,550,551,551,552]

我需要通过最大四个数字删除彼此接近的数字,例如:

num-4 <= x <= num +4

最后我需要的列表应该是这样的:

list = [75,154,260,550]

list = [76,156,263,551]

留在列表中的数字并不重要,只有一个接近的数字。

我试过这个给了我:

for i in range(len(l)):
    for j in range(len(l)):
        if i==j or i==j+1 or i==j+2 or i == j+3:
            pp= l.pop(j)
            print(pp)
print(l)


IndexError: pop index out of range

这个不能按我需要的方式工作:

    for q in li:
        for w in li:
            print(q,'////',w)
            if q == w or q ==w+1 or q==w+2 or q==w+3:
                rem = li.remove(w)

谢谢

python loops
3个回答
2
投票

下面使用

groupby
来识别以值
start
开始并包含与
start
相差不超过 4 的可迭代的运行。然后我们将所有这些
start
值收集到一个列表。

from itertools import groupby

def runs(difference=4):
    start = None
    def inner(n):
        nonlocal start
        if start is None:
            start = n
        elif abs(start-n) > difference:
            start = n
        return start
    return inner

print([next(g) for k, g in groupby(mylist, runs())])
# [75, 154, 260, 550]

这假设输入数据已经排序。如果不是,则必须对其进行排序:

groupby(sorted(mylist), runs())


1
投票

您可以使用集合或列表来完成此操作,您不需要字典。

usedValues = set()
newList = []

for v in myList:
    if v not in usedValues:
        newList.append(v)

        for lv in range(v - 4, v + 5):
            usedValues.add(lv)

print(newList)

此方法将所有值存储在您目前看到的每个值的 4 以内。当你从 myList 中查看一个新值时,你只需要通过检查 usedValues 来检查你之前是否在它的大概范围内看到过某些东西。


0
投票

作为解决方案之一

numbers = [75, 75, 76, 77, 78, 79, 154, 155, 154, 156, 260, 262, 263, 550, 551, 551, 552]
new_numbers = []

for i in numbers:
    if len(list(filter(lambda x: (abs(x - i) < 5), new_numbers))) == 0:
        new_numbers.append(i)

print(new_numbers)

#[75, 154, 260, 550]
© www.soinside.com 2019 - 2024. All rights reserved.