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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除列表中彼此接近的数字相关的知识,希望对你有一定的参考价值。

我有一个清单

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)

谢谢

答案

下面使用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())

另一答案

您可以使用集合或列表完成此操作,您不需要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来检查你是否在它的球场中看到了什么。

以上是关于删除列表中彼此接近的数字的主要内容,如果未能解决你的问题,请参考以下文章

如果列值在一定范围内彼此接近,则删除 pandas 行

用于查找彼此接近的值的 SQL 语句

Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数

从整数列表中,获取最接近给定值的数字

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图