删除列表中彼此接近的数字
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来检查你是否在它的球场中看到了什么。
以上是关于删除列表中彼此接近的数字的主要内容,如果未能解决你的问题,请参考以下文章
Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数