我有一个像
这样的列表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())
。
您可以使用集合或列表来完成此操作,您不需要字典。
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 来检查你之前是否在它的大概范围内看到过某些东西。
作为解决方案之一
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]