需要从字典中获取一个值列表,然后从总值中减去该值

时间:2018-11-11 15:59:24

标签: python python-3.x list dictionary for-loop

我意识到标题可能会造成混淆,所以请允许我解释一下。

我从类似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循环来遍历每个频率值,并将该值更改为输入到列表中的总次数,并减去任何大于该值的值。我不确定该如何处理,因此将不胜感激。

4 个答案:

答案 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]

您想要的结果存储在keyscumsum中:

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。