python - 比较列表的每个元素是否都大于其他所有元素
问题描述
我想比较列表中的第一个元素是否大于其他所有元素(其他所有元素都相同)。如果一个元素大于另一个元素,则为 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 秒总结一次
解决方案
这是一种更有效的方法,首先对列表进行排序,这使得过程 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]
推荐阅读
- javascript - 加入站点的电报组时如何处理从Web应用程序登录的用户ID?
- reactjs - 如何隐藏/取消隐藏密码 Material ui
- node.js - 有没有办法创建具有设置类型参数和返回值的方法?
- javascript - 有什么方法可以在反应js中进行时间倒计时吗?
- python - 安装和运行 Wheel 文件 Pypi
- list - 如何减少页面中列表的空间?
- docusignapi - 从表单中读取电子邮件 ID 并以编程方式更新信封中的收件人列表
- azure - Azure Durable Functions - OrchestrationTrigger 卡住
- vue.js - Vuemapbox 标记显示在页面底部
- c++ - 如何使用 CMake 和 Qt Creator 自动将 Qt 依赖项复制到构建目录?