鉴于奶牛和他们的体重:
<'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
希望在有人有时间回复之前我会发布自己的答案
答案 0 :(得分:0)
对于初学者,您可以显着提高greedy_cow_transport
功能的效率。看起来你在这里重新发明了几个轮子,更不用说其他一些奇怪的问题了。即:
为什么声明参数limit
但从不使用它?
为什么所有变量名称都大写? Python中的大写名称通常是为类保留的。
为什么要通过从N
一次添加一个元素来创建列表cows
?
就此而言,您为什么不在.items()
上使用cows
方法?
这个让我很困惑。您在代码的一部分中使用.keys()
函数来获取所有密钥,然后将它们存储在另一个列表中的元组的一部分,然后再次手动提取这些密钥以将它们放入另一个< / em>列表。为什么不直接从.keys()
?
为什么要在lambda中重用变量名N
?这可能没什么问题,但很容易导致出现奇怪的问题。
您对数据的实际操作是什么?你声明并分配这些变量,但实际上从不对它们做任何事情。你的意思是归还吗?
此外,为什么有必要将所有名称都放在一个单独的列表中?您已经在多个地方拥有该信息。
将所有这些放在一起,您的功能可能类似于:
def greedy_cow_transport(cows):
cowList = list(sorted(cows.items(), key=lambda x: x[1], reverse=True)
return cowList
然后那只是提出另一个问题:
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循环'的每次迭代相对应