Python 3.5在简单的贪婪午睡袋算法中高效使用字典

时间:2016-11-15 20:37:02

标签: python dictionary

鉴于奶牛和他们的体重:

<'Betsy':9,'Oreo':6,'Herman':7,'佛罗伦萨':2,'Maggie':3,'Moo Moo':3,'奶昔':2,'Lola' :2,'米莉':5,'亨丽埃塔':9}

我想获得一个列表来移动所有的奶牛,每个奶牛的嵌套列表总重量<= 10,因此前两次旅行将只有Betsy和Henrietta: 贪婪的COW运输答案:

<[>'Betsy'],['Henrietta'],['Herman','Maggie'],['Oreo','Moo Moo'],['Millie','Florence','Milkshake'] ,['萝拉']]

这是我在网络评分员中花了太长时间的代码:

def greedy_cow_transport(cows,limit=10):
    N = []
    for key in cows.keys():
        N.append((key, cows[key]))
    CowTupleList = sorted(N, key=lambda N: N[1], reverse = True)
    names = []
    for i in CowTupleList:
        names.append(i[0])

    Results = []
    while sum(cows.values()) > 0:
        result = []
        total = 0
        for cow in names:
            if cows[cow] != 0 and cows[cow] + total <=10:
                result.append(cow)
                total += cows[cow]
                cows[cow] = 0
        Results.append(result)
    return Results

希望在有人有时间回复之前我会发布自己的答案

3 个答案:

答案 0 :(得分:0)

对于初学者,您可以显着提高greedy_cow_transport功能的效率。看起来你在这里重新发明了几个轮子,更不用说其他一些奇怪的问题了。即:

  1. 为什么声明参数limit但从不使用它?

  2. 为什么所有变量名称都大写? Python中的大写名称通常是为类保留的。

  3. 为什么要通过从N一次添加一个元素来创建列表cows

  4. 就此而言,您为什么不在.items()上使用cows方法?

  5. 这个让我很困惑。您在代码的一部分中使用.keys()函数来获取所有密钥,然后将它们存储在另一个列表中的元组的一部分,然后再次手动提取这些密钥以将它们放入另一个< / em>列表。为什么不直接从.keys()

  6. 抓取它们
  7. 为什么要在lambda中重用变量名N?这可能没什么问题,但很容易导致出现奇怪的问题。

  8. 您对数据的实际操作是什么?你声明并分配这些变量,但实际上从不对它们做任何事情。你的意思是归还吗?

  9. 此外,为什么有必要将所有名称都放在一个单独的列表中?您已经在多个地方拥有该信息。

  10. 将所有这些放在一起,您的功能可能类似于:

    def greedy_cow_transport(cows):
        cowList = list(sorted(cows.items(), key=lambda x: x[1], reverse=True)
        return cowList
    

    然后那只是提出另一个问题:

    1. 为什么你从不使用greedy_cow_transport功能?如果您没有使用它,为什么要将它包含在这个问题中?

答案 1 :(得分:0)

谢谢你们所有的帮助,最后提出来了:

def greedy_cow_transport(cows,limit=10):
    '''cows is dict of {'name': weight, ...} pairs'''
    train = []
    while sum(cows.values()) > 0:
        cart = []
        total = 0
        for cow, value in sorted(cows.items(), key=lambda x: x[1], reverse = True):
            if cows[cow] != 0 and value + total <= limit:
                cart.append(cow)
                total += value
                cows[cow] = 0
        train.append(cart)
    return train

答案 2 :(得分:0)

def greedy_cow_transport(cows,limit=10):
    train = []
    COWS = cows.copy()
    SortedCows = sorted(COWS.items(), key=lambda x: x[1], reverse = True)
    while sum(COWS.values()):
        cart = []
        total = 0
        for cow, value in SortedCows:
            if COWS[cow] != 0 and value + total <= 10:
                cart.append(cow)
                total += value
            COWS[cow] = 0
    train.append(cart)

    return train 
如果您只打电话,

显着节省:

sorted(COWS.items(), key=lambda x: x[1], reverse = True) 

一次,与原始

中'for循环'的每次迭代相对应