簡體   English   中英

刪除列表中彼此接近的數字

[英]removing numbers which are close to each other in a list

我有一個類似的清單

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來檢查是否已在球場中看到東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM