我需要做的是将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]]
输出是列表中的列表!有没有一种简单的方法可以通过重写函数来消除它?
答案 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()
查找列表的最小编号。