删除lis中彼此接近的号码

2024-04-19 23:10:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张单子

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

我需要删除由maxumim四个数字相互接近的数字,如:

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)

谢谢


Tags: orinforlenifrange数字li
2条回答

你可以用一个集合或列表来完成,你不需要一个dict

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来检查之前是否在其大致范围内看到了某些内容。你知道吗

下面使用^{}标识来自iterable的运行,这些运行以值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())。你知道吗

相关问题 更多 >