我有一个类似
的列表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)
谢谢
答案 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即可检查是否已在球场中看到某些东西。