首页 > 解决方案 > 比较列表的每个元素是否都大于其他所有元素

问题描述

我想比较列表中的第一个元素是否大于其他所有元素(其他所有元素都相同)。如果一个元素大于另一个元素,则为 1。 1 的总和(取决于“赢得”比较的次数)应该以一种方式存储,让我知道列表的每个特定元素有多少比较哇.

澄清列表中的每个元素将是具有 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 秒总结一次

标签: pythonloopscompare

解决方案


这是一种更有效的方法,首先对列表进行排序,这使得过程 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]

推荐阅读