Что не так с этой программой? Когда я его компилирую, один из списков с именем «single_bovines» добавляется, даже если нет команд, сообщающих что-либо, добавляемое к нему. Линии, которые заканчиваются линией #debug
, являются линиями, которые я пытаюсь отладить программу.Список Python Append Screw up
class Cow(object):
def __init__(self, height, weight, strength):
self.height = height
self.weight = weight
self.strength = strength
class Combination(object):
def __init__(self, cows):
self.cows = cows
self.evaluated_flag = False
self.satisfied_height = False
self.satisfied_strength = False
self.safety_factor = None
def evaluate(self, mark_height):
if sum(map(lambda c: c.height, self.cows)) >= mark_height:
self.satisfied_height = True
self.satisfied_strength = True
for i, cow in enumerate(self.cows):
if sum(map(lambda c: c.weight, self.cows[i+1:])) > cow.strength:
self.satisfied_strength = False
break
if self.satisfied_height and self.satisfied_strength:
self.safety_factor = 999999
for i, cow in enumerate(self.cows):
self.safety_factor = min(cow.strength - sum(map(lambda c: c.weight, self.cows[i+1:])), self.safety_factor)
return self.satisfied_height, self.satisfied_strength
def get_safety_factor(self):
return self.safety_factor
file = open('guardmark.in', 'r').readlines()
number_of_cows, mark_height = map(lambda item: int(item), file[0].rstrip('\n').split(' '))
consideration_list = []
for line in file[1:]:
height, weight, strength = map(lambda item: int(item), line.rstrip('\n').split(' '))
consideration_list.append(Combination([Cow(height, weight, strength)]))
single_bovines = consideration_list
complete_list = []
consideration_done = True
while filter(lambda c: c.evaluated_flag == False, consideration_list):
for combo in consideration_list:
print "a combo" #debug line
height_flag, strength_flag = combo.evaluate(mark_height)
if height_flag and strength_flag:
combo.evaluated_flag = True
complete_list.append(combo)
if not strength_flag:
combo.evaluated_flag = True
if strength_flag and not height_flag:
combo.evaluated_flag = True
print "put into consideration" #debug line
for single_cow in single_bovines:
print "a cow" , len(single_bovines)#debug line
if single_cow not in combo.cows:
combo_cows_copy = combo.cows
combo_cows_copy.append(single_cow)
consideration_list.append(Combination(combo_cows_copy))
if not complete_list:
print "Mark is too tall"
else:
safety_factors = []
for combo in complete_list:
safety_factors.append(combo.get_safety_factor())
print max(safety_factors)
Не могли бы вы сократить свой пример кода? Было бы неплохо, если бы вы могли удалить части, не связанные непосредственно с проблемой. (Это не только полезно для нас, но и хорошая технология отладки, чтобы изолировать проблему.) –
Я думаю, что проблема может заключаться в том, что вы выполняете 'single_bovines = рассмотрение_list', что означает, что оба имени переменных относятся к * тому же * списку , Если вам нужны два разных списка (оба имеют одинаковое содержимое), используйте 'single_bovines = list (review_list)' или 'single_bovines = рассмотрения_list.copy()' или 'single_bovines = рассмотрения_list [:]'. –
Возможный дубликат [Python, изменяющий неправильный список?] (Http://stackoverflow.com/questions/4337106/python-modifying-wrong-list) – Fiver