我意识到标题可能会造成混淆,所以请允许我解释一下。
我从类似L = [21.123, 22.123, 23.123, 21.123]
的列表中获取输入
我删除了小数点,然后将列表从高到低排序。我也将其更改为带有出现次数的字典,看起来像
newlist = {23: 1, 22: 1, 21: 2}
我需要做的是列出键和值的列表,我可以这样做。这给了我两个列表,分别是[23, 22, 21]
和[1, 1, 2]
的一个列表,值的出现一个。我需要将出现列表转换为与之对应的键相同或更低的出现次数。
我希望我的列表看起来像[23, 22, 21]
(这很容易做到)和[4, 3, 2]
,因为有4次是23秒或更短,有3次是22秒或更短,并且其中2次的时间不超过21秒。
我很确定我需要一个for循环来遍历每个频率值,并将该值更改为输入到列表中的总次数,并减去任何大于该值的值。我不确定该如何处理,因此将不胜感激。
答案 0 :(得分:2)
这是一个实用的解决方案。边际棘手的部分是向后累积总和,可以向itertools.accumulate
输入反向元组,然后反转结果。
from collections import Counter
from itertools import accumulate
from operator import itemgetter
L = [21.123, 22.123, 23.123, 21.123]
c = Counter(map(int, L)) # Counter({21: 2, 22: 1, 23: 1})
counter = sorted(c.items(), reverse=True) # [(23, 1), (22, 1), (21, 2)]
keys, counts = zip(*counter) # ((23, 22, 21), (1, 1, 2))
cumsum = list(accumulate(counts[::-1]))[::-1] # [4, 3, 2]
您想要的结果存储在keys
和cumsum
中:
print(keys)
(23, 22, 21)
print(cumsum)
[4, 3, 2]
答案 1 :(得分:2)
您想要一个字典,其中对于数据中的每个项目,键都是舍入值(int(item)
),值是小于或等于此舍入值的项目数。 / p>
字典理解(与列表理解结合)可以做到:
data = [21.123, 22.123, 23.123, 21.123]
aggregate = {
item: len([n for n in data if int(n) <= item])
for item in set(map(int, data))
}
print(aggregate) # -> {21: 2, 22: 3, 23: 4}
这是编写这样一个循环的单语句形式:
aggregate = {}
for item in set(map(int, data)):
aggregate[item] = len([n for n in data if int(n) <= item])
}
使用set()
可使列表唯一。这样,循环仅在必要时运行。
答案 2 :(得分:1)
假设您正确地从[21.123, 22.123, 23.123, 21.123]
获得了计数,那么一个带有运行总和的简单嵌套循环就可以完成其余工作:
from collections import Counter
newlist = {23: 1, 22: 1, 21: 2}
counts = Counter()
for k in newlist:
for v in newlist:
if v <= k:
counts[k] += newlist[v]
print(counts)
# Counter({23: 4, 22: 3, 21: 2})
您还可以使用itertools.product()
将双循环压缩为一个:
from itertools import product
from collections import Counter
newlist = {23: 1, 22: 1, 21: 2}
counts = Counter()
for k, v in product(newlist, repeat=2):
if v <= k:
counts[k] += newlist[v]
print(counts)
# Counter({23: 4, 22: 3, 21: 2})
以上将计数存储在collections.Counter()
中,您可以通过调用[4, 3, 2]
来获得list(counts.values())
。
答案 3 :(得分:0)
我找到了自己的解决方案,这似乎相对简单。代码看起来像
counter = 0
print(valuelist)
for i in valuelist:
print(int(solves - counter))
counter = counter + i
redonevalues.append(solves - counter + 1)
获取我的值,转到第一个值,将出现的值添加到计数器中,从求解中减去计数器,然后将其加1。