Python 将列表值指定给另一个列表

Python 将列表值指定给另一个列表,python,list,Python,List,我有两个长度相同的列表,一个包含整数,一个包含浮点。我想把每个浮点数都赋给一个整数-相对而言 所谓相对,我的意思是: 较高的整数有较高的机会接收较低的浮点数 较低整数接收较低浮点数的概率应较低 对于赋值,将浮点数附加到结果数组中就足够了,这样整数[index]就可以与赋值的结果[index]匹配 因为我说的是机会,所以我不能简单地将一个列表的降序和一个列表的升序排序并匹配它们 我不太确定如何解决我的问题。我正在寻找一些我从未听说过的函数/模块,或者像往常一样喜欢:纯python内置解决方案:

我有两个长度相同的列表,一个包含整数,一个包含浮点。我想把每个浮点数都赋给一个整数-相对而言

所谓相对,我的意思是:

  • 较高的整数有较高的机会接收较低的浮点数
  • 较低整数接收较低浮点数的概率应较低
对于赋值,将浮点数附加到结果数组中就足够了,这样
整数[index]
就可以与赋值的
结果[index]
匹配

因为我说的是机会,所以我不能简单地将一个列表的降序和一个列表的升序排序并匹配它们

我不太确定如何解决我的问题。我正在寻找一些我从未听说过的函数/模块,或者像往常一样喜欢:纯python内置解决方案:)


如您所见,在结果示例中,
结果[9]==0.5
被分配给
整数[9]==3
,而
结果[6]==0.6
被分配给
整数[6]==4
。这是列表其余部分的一个例外,因为通常较高的浮点数被分配给较低的整数。

类似这样的操作应该可以做到:

import random

def shuffle(ints, floats):

    new_ints = list(sorted(ints))
    new_floats = list(sorted(floats))

    def weight(x, n):
        # implement your own weight system here
        # maybe `n+x` - just make sure that as
        # x increases the weight increases
        return x

    def gen_weights(n):
        return [weight(x,n) for x in range(1,n+1)]

    result = []
    while new_ints:
        i = random.choices(range(len(new_ints)), gen_weights(len(new_ints)))[0]
        result.append((new_ints.pop(0), new_floats.pop(i)))

    new_result = []
    for x in ints:
        for i, (j, f) in enumerate(result):
            if j == x:
                new_result.append(f)
                del result[i]
                break
    return new_result

random.seed(1)

in1 = [5,   5,   2,   4,   3,   1,   4,   5,   2,   3  ]
in2 = [0.1, 0.2, 0.3, 0.3, 0.3, 0.7, 0.6, 0.8, 0.5, 0.5]

result = shuffle(in1, in2)
print(result)
输出:

[0.3, 0.1, 0.8, 0.5, 0.3, 0.3, 0.7, 0.2, 0.6, 0.5]

本质上,它会对两个列表进行排序,然后为每个浮动创建一组权重,以确定选择它们的可能性。它从浮点集合中删除该索引,选择整数集合的第一个值,并将其存储在结果列表中,从整数集合和浮点集合中删除项目

最后,该函数遍历原始ints列表中的每个项,并在结果列表中找到相应的整数值。它删除该值,并将其附加到输出(
new\u result
)列表中


如果您不喜欢线性权重系统,请将
权重
函数中的
返回x
值替换为任何其他递增函数。确保
x
的较高值具有较高的返回值



希望这有帮助:)

这里有一个相对简单的方法:

import random

STD_DEV = 2

integers = sorted([5, 5, 2, 4, 3, 1, 4, 5, 2, 3], reverse=True)
floats = sorted([0.1, 0.2, 0.3, 0.3, 0.3, 0.7, 0.6, 0.8, 0.5, 0.5])

results = []
for i in range(0, len(integers)): 
    noisy_index = min(max(int(random.gauss(i, STD_DEV)), 0), len(floats)-1)
    results.append(floats[noisy_index])

print(results)
# [0.1, 0.2, 0.3, 0.2, 0.5, 0.3, 0.5, 0.5, 0.8, 0.7]
它首先对整数进行降序排序,然后对浮点值进行升序排序,然后在整数索引上循环,并通过从该索引值周围的高斯分布中采样来确定要选择的浮点值的索引。STD_-DEV值将为您提供一个关于选择更多索引的频率的控制…我选择STD_-DEV=2是因为它的性能似乎合理(即,index=0不太可能跳到index=9)

请注意,这实际上是一种相对加权方法。排序后的整数索引值确定了最有可能选择的浮点值,但如果前两个数字是
5,5…
500,5…
,则其行为相同

编辑:如果您希望整数值的权重超出其相对顺序,一种方法是根据该值调整guassian分布的标准偏差。这里有一种方法(您可以使用多种方法中的一种)仅根据整数值与平均值的距离缩放标准偏差:

import random

BASE_STD_DEV = 2

integers = sorted([5, 5, 2, 4, 3, 1, 4, 5, 2, 3], reverse=True)
floats = sorted([0.1, 0.2, 0.3, 0.3, 0.3, 0.7, 0.6, 0.8, 0.5, 0.5])

avg_int = sum(integers)/len(integers)
max_dist = max([abs(i - avg_int) for i in integers])

results = []
for i, integer in enumerate(integers):
    factor = 1 - abs(integer - avg_int) / max_dist
    std_dev = BASE_STD_DEV * factor
    noisy_index = min(max(int(random.gauss(i, std_dev)), 0), len(floats)-1)
    results.append(floats[noisy_index])

print(results)
# [0.1, 0.2, 0.3, 0.2, 0.5, 0.3, 0.5, 0.5, 0.8, 0.7]

您可以很容易地将其调整为可能具有最小标准偏差或最小/最大
系数,因为当前极端值没有标准偏差。

高数值有多高?绝对高,还是给定列表中的高?嗯,我认为最好依靠列表本身,找到一个普遍的解决方案。因此,在我的示例中,整数的“high”值为5,浮点数的“high”值为0.8。但考虑到其他列表,这可能会延迟这种方法,特别是因为它提供了对标准偏差的控制。在接受答案之前,我也会对Ed Ward的解决方案进行测试。现在我和你的解决方案有点冲突,因为它忽略了整数的绝对值,正如你自己指出的。我会考虑一下。我想到的一个快速技巧是:可以根据整数的值缩放STD_DEV值。因此,一个非常大的整数可以有一个较小的STD_DEV(可供选择的较窄分布),并且更有可能保持在较低的索引浮点值。实际上,您可能希望根据与平均值的距离来缩小分布,MaxSchlesag给出了一个替代方案,显示了考虑整数值的一种方法。如果有帮助,请告诉我。
import random

BASE_STD_DEV = 2

integers = sorted([5, 5, 2, 4, 3, 1, 4, 5, 2, 3], reverse=True)
floats = sorted([0.1, 0.2, 0.3, 0.3, 0.3, 0.7, 0.6, 0.8, 0.5, 0.5])

avg_int = sum(integers)/len(integers)
max_dist = max([abs(i - avg_int) for i in integers])

results = []
for i, integer in enumerate(integers):
    factor = 1 - abs(integer - avg_int) / max_dist
    std_dev = BASE_STD_DEV * factor
    noisy_index = min(max(int(random.gauss(i, std_dev)), 0), len(floats)-1)
    results.append(floats[noisy_index])

print(results)
# [0.1, 0.2, 0.3, 0.2, 0.5, 0.3, 0.5, 0.5, 0.8, 0.7]