Python根据索引对数字列表进行排序

2024-04-28 21:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个程序,该程序有一个类来包装一个对象“Food”,还有一个名为“fridge”的列表来保存由类“Food”创建的这些对象。你知道吗

class Food:
    def __init__(self, name, expiration):
        self.name = name
        self.expiration = expiration


fridge = [Food("beer",4), Food("steak",1),  Food("hamburger",1),  Food("donut",3),]

这并不难。然后我创建了一个函数,给你一个过期数最高的食物。你知道吗

def exp(fridge):
    expList=[]
    xen = 0
    for i in range(0,len(fridge)):
        expList.append(fridge[xen].expiration)
        xen += 1
    print(expList)
    sortedList = sorted(expList)
    return sortedList.pop()

exp(fridge)

这个也可以,现在我必须创建一个函数,返回一个列表,其中列表的索引是过期日期,索引的编号是过期日期的食物的编号。 输出应该如下所示:[0,2,1,1]-第一个索引0表示没有过期日期为“0”的食品。指数1表示有2种食品的有效期还剩1天。等等。我被太多的如果线卡住了,我不能让这一个工作在所有。我该如何处理这个问题?谢谢你的帮助。你知道吗


Tags: 对象函数nameself程序列表fooddef
3条回答

为了将它作为一个列表返回,您首先需要计算出冰箱中的最长有效期。你知道吗

max_expiration = max(food.expiration for food in fridge) +1 # need +1 since 0 is also a possible expiration
exp_list = [0] * max_expiration
for food in fridge:
    exp_list[food.expiration] += 1
print(exp_list)

返回[0, 2, 0, 1, 1]

您可以迭代Food对象列表,并更新过期时键入的字典,值为过期的项数。避免冗余,例如使用collections.Counter对象(dict的子类)在列表中保持零计数:

from collections import Counter

d = Counter(food.expiration for food in fridge)
# fetch number of food with expiration 0
print(d[0]) # -> 0
# fetch number of food with expiration 1
print(d[1]) # -> 2

您可以使用^{}创建一个dict,其中key是食品过期日期,value是它在列表中出现的次数

>>> from itertools import groupby
>>> fridge = [Food("beer",4), Food("steak",1),  Food("hamburger",1),  Food("donut",3),]
>>> d = dict((k,len(list(v))) for k,v in groupby(sorted(l,key=lambda x: x.expiration), key=lambda x: x.expiration))

这里我们指定groupby来对列表中具有相同expiration的所有元素进行分组(注意groupby中的key参数)。groupby操作的输出大致相当于(k,[v]),其中k是组键,[v]是属于该特定组的值列表。你知道吗

这将产生如下输出:

>>> d
>>> {1: 2, 3: 1, 4: 1}

在这一点上,我们有expiration和特定过期发生在一个列表中的次数,这个列表存储在dictd中。你知道吗

接下来,我们需要创建一个列表,以便如果dictd中存在一个元素,则输出它,否则输出0。我们需要在dictd键中从0迭代到max number。为此,我们可以:

>>> [0 if not d.get(x) else d.get(x) for x in range(0, max(d.keys())+1)]

这将产生所需的输出

>>> [0,2,0,1,1]

相关问题 更多 >