我想比较列表中的元素是否大于其他元素(对于其他每个元素相同(。如果一个元素大于另一个元素,则会获得1。1s的总和(取决于比较的数量" won"(应该以一种方式存储,以便让我知道列表中每个特定元素的比较wow有多少个比较。
澄清列表的每个元素都是一个具有ID
的个人python
#Here I create 10 random values which I call individual with the random
#funcion plus mean and standard deviation
a, b = 3, 10
mu, sigma = 5.6, 2
dist = stats.truncnorm((a - mu) / sigma, (b - mu) / sigma, loc=mu, scale=sigma)
individuals = dist.rvs(10)
#Initialize the list where I want to store the 1s
outcome = num.zeros(n)
#Trying to loop through all the elements
for k in range(0, n):
for j in range(0, n):
if individuals[k] == individuals[j]:
continue
elif individuals[k] < individuals[j]:
continue
elif individuals[k] > individuals[j]:
outcome[i] += 1
return outcome[i]
我最终有一个单一值的结果。大概是在第一个元素中每1个总结
这是一种更有效的方法,首先对列表进行排序,这使得o(n*log(n((而不是o(n ** 2(。
我们对列表进行排序,保留每个值的原始索引(这是O(n*log(n((。
然后,我们遍布列表以设置输出计数,这是排序列表中值的索引,除了重复项外 - 在这种情况下,我们只能跟踪相同的值数量以进行调整。结果。
def larger_than(values):
ordered_values = sorted((value, index) for index, value in enumerate(values))
out = [None] * len(values)
# take care of equal values
equals = 0
prev = None
for rank, (value, index) in enumerate(ordered_values):
if value == prev:
equals += 1
else:
equals = 0
prev = value
out[index] = rank - equals
return out
一些测试:
values = [1, 4, 3, 3, 10, 1, 5, 2, 7, 6]
print(larger_than(values))
# [0, 5, 3, 3, 9, 0, 6, 2, 8, 7]