将所有值放在一个数组中

时间:2016-07-31 13:48:48

标签: python arrays algorithm sorting

我需要做的是将l1中的值“粉碎”一定百分比,以便它们更接近在一起,这样,如果数组l1可能......

l1 =[10,20,30,40,50,60,70,80,90,100]

然后l2 可以......

l2 = [12.5, 25.0, 37.5, 50.0, 62.5, 45.0, 52.5, 60.0, 67.5, 75.0]

可以在一个简单的脚本上完成,例如......

for i in l1:
    if i <= 50:
        i = (i*1.25)
        l2.append(i)
        print(i)
    elif i >= 50:
        i = (i*0.75)
        l2.append(i)

print (l2)

因此,这表明我需要将所有物品放在一起 - 理想情况下是一些百分位数(打印)。当你有这样的列表时会出现问题......

l1 =[4,2,3,4,3,6,4,8.6,10,7,12,4,14,15,26,14,15,16,10]

我需要做的是将所有项目分开(所以按一定比例),但是循环。我需要“压缩”或“粉碎”数组的值,减小每个数字之间的范围,从最小到最大,从最大到最小(更接近中位数)。我不能只按整个列表划分,因为范围保持不变。

我认为解决这个问题的一种方法(我现在正在研究)将是(a)找到l1的中位数,(b)从l1中的最小和最大项目开始,将该项目增加10%它的值或减少它的值的10%(在最大项目的情况下),然后工作到同一循环中的第二个最小和最大的项目(以避免脚本超过相同的'较小变量'两次) 。

这意味着将值从大到小列出,同时保持它们在数组中的位置(这很重要),然后搜索该列表并对数组l1的每个对应值进行更改。

关注所提出的解决方案... ......的一次迭代

import statistics
a = [4, 3, 3, 4, 5, 1, 31, 321]
input_scope = 1.1

def scouter (input_list, scope):
    mean = statistics.mean(input_list)
    searchpositions = []
    for x, i in enumerate(input_list):
            print (x, i)
            if i == max(input_list) or i == min(input_list):
                searchpositions.append(x)

    for i in searchpositions:
        input_list[i] = [(input_list[i] - mean) / scope + mean]
    return (input_list)
print(scouter((a), input_scope))

给我我需要的东西,有点......

[4, 3, 3, 4, 5, [5.13636363636364], 31, [296.0454545454545]]

输出是列表中的列表!有没有一种简单的方法可以通过重写函数来消除它?

3 个答案:

答案 0 :(得分:2)

只是缩小到中位数?

>>> l1 = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

>>> import statistics
>>> median = statistics.median(l1)
>>> [(x - median) / 10 + median for x in l1]
[50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5]

答案 1 :(得分:1)

我知道我来晚了,但是我确切地知道您需要什么,我也有自己使用的解决方案。我想出了这个解决方案:

对于集合中的每个数字 n ,您将获得一个新的数字 x ,该数字更接近集合的平均值。公式:

x = mean + factor * (n - mean)

因子的范围是0到1,代表数字需要增加或减少到平均值的数量。 0 =所有数字变为平均值,1 =所有数字保持相同。调整自己的需求。

集合的平均值显然是集合中每个数字的总和除以集合的长度。

希望这对将来登陆这里的人有帮助。

答案 2 :(得分:0)

为什么不找到列表中的最小数字并将整个列表除以该数字?甚至是你想要的任何数字。

num = percentage/100 # gets you a decimal
l2 = [x*num for x in l1]

如果您想要这样做,请使用min()查找列表的最小编号。