在列表中查找并替换彼此之间一定范围内的数字

时间:2018-07-06 20:23:13

标签: python

这里是初学者,所以答案可能非常明显(希望编辑后的代码比我的意大利面条代码更好)...

我有五个数字的清单。

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范围内(在这种情况下,完全相同)。

如何防止这种情况发生?

3 个答案:

答案 0 :(得分:1)

您的问题是新的替换号码可能在任何先前号码的10以内。一种明显的处理方法是将新号码与所有先前的号码进行比较。

这意味着您需要对所有较早的数字进行另一个循环。除了在my_list[i+1:]为0时my_list[:i-1]会做错事情之外,这与您在i上的循环几乎相同。

您需要围绕它进行第二次循环,因为您需要继续尝试直到找到可接受的值。

为避免在我们几乎没有足够的空间容纳屏幕上的任何内容之前向右嵌套两个级别,让我们将其重构为一个函数:

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

答案 1 :(得分:1)

您做这样的事情

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]

答案 2 :(得分:0)

我将通过改善其替换功能来扩展@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)