簡體   English   中英

在列表中查找並替換彼此之間一定范圍內的數字

[英]Find and replace numbers in list that are within a certain range of one another

初學者在這里,所以答案可能會非常明顯(希望編輯后的代碼比我的意大利面條代碼更好)...

我有五個數字的清單。

my_list = [-197, -198, -193, -87, -192]

我需要找到彼此之間在10范圍內的所有數字。 即-197,-198,-193和-192都屬於該類別。

我需要用其他數字替換這些罪魁禍首數字。

這是我嘗試完成的代碼:

from random import randint, choice

my_list = [-197, -198, -193, -87, -192]

n = len(my_list)
for i in range(n):
    for y in my_list[i+1:]:
        if abs(my_list[i] - y) <= 10: 
            mylist[i] = randint(-275, 275)

但是(!)有時(並且可以理解)會得到如下結果:

my_list = [-110, -110, -64, -87, -192]

-110和-110仍在彼此的10范圍內(在這種情況下,完全相同)。

如何防止這種情況發生?

您的問題是新的替換編號可能在任何先前編號的10以內。 一種明顯的處理方法是對照所有先前的號碼檢查新號碼。

這意味着您需要對所有早期數字進行另一個循環。 這與您在my_list[i+1:]循環幾乎相同,除了增加的問題是,當i為0時, my_list[:i-1]會做錯事情。

而且,您還需要第二次循環,因為您需要不斷嘗試,直到找到可接受的值為止。

為了避免在右邊再嵌套兩個級別,直到我們幾乎沒有足夠的空間容納屏幕上的任何內容,讓我們將其重構為一個函數:

def tooclose(lst, n):
    for val in lst:
        if abs(val - n) <= 10:
            return True
    return False

for i in range(n):
    for y in my_list[i+1:]:
        if abs(my_list[i] - y) <= 10: 
            while True:
                newval = randint(-275, 275)
                if i==0 or not tooclose(my_list[:i-1]. newval):
                    break
            my_list[i] = newval

你做這樣的事情

my_list = [-197, -198, -193, -87, -192]
for i,(p,n) in enumerate(zip(my_list, my_list[1:])):
    if abs(p-n) <= 10:
        my_list[i+1] = randint(*choice([(-275,p-10), (p+10, 275)]))

print (my_list)
# [-197, -242, -193, -87, -192]

或幾乎等效的單線

from itertools import accumulate
list(accumulate(my_list, lambda p,n: n if abs(p-n)>10 else randint(*choice([(-275,p-10), (p+10, 275)])) ))
# [-197, 131, -193, -87, -192]

我將通過改善其替換功能來擴展@abarnet的答案。 它所做的是維護randint可接受的所有結果的列表,並從中選擇一個隨機值。 選擇一個值之后,它將更新列表以刪除新選擇的值中十個以內的所有值。

對於您的情況,您的列表將包含-275到275之間的整數,然后您將需要取出列表中任何整數的10以內的整數。 然后,使用功能選擇新值。 howmany允許您選擇所需的整數。

import random
def randpick(howmany, acceptablelist):
    a = []
    for i in range(howmany):
        a.append(random.choice(acceptablelist))
        acceptablelist = list(set(acceptablelist)-set(range(a[-1]-10,a[-1]+11)))
    return (a, acceptablelist)

暫無
暫無

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

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