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

时间:2018-11-06 17:54:24

标签: python loops

我有一个类似

的列表
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)

谢谢

2 个答案:

答案 0 :(得分: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 :(得分:0)

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

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即可检查是否已在球场中看到某些东西。