Найти - Пользователи
Полная версия: В программе странно работает функция min()
Начало » Python для новичков » В программе странно работает функция min()
1 2
PythonOrangutang
В программе странно работает функция min().
 i = open('boxes.in', 'r')
line = i.read().splitlines()
n = str(line[0]).split()[0]
m = str(line[0]).split()[1]
del line[0]
print(min(line))
counter = 1
counter2 = 0
counter3 = 0
p = 0
while counter <= int(m):
	if int(n) >= counter3 + int(min(line)):
		counter3+=int(min(line))
		a = line.index(min(line))
		print(a, line[a])
		del line[a]
		counter2+=1
	counter+=1
i.close()
o = open('boxes.out', 'w')
o.write(str(counter2))
o.close()
Содержимое файла boxes.in:
20 10
3
9
4
2
5
47
2
12
9
6

Программа почему-то находит минимальным сначала число 12, а только потом 2, 4 и т. д. Как решить?
Rodegast
Ты бы хоть написал что эта программа должна делать?
PythonOrangutang
Rodegast
Ты бы хоть написал что эта программа должна делать?
Поверь, будет сложно объяснить. Фактически мне нужно перебирать минимальные числа из файла boxes.in (не считая первой строки). Наименьшие числа складывать, пока следующее прибавление не превысит число n (в данном случае 20). И написать количество прибавленых чисел.
2+2+3+4+5=16<20
Если прибавить следующее наименьшее число (6), то выйдет больше чем 20, а такая ситуация нам не нужна.
Количество сложенных чисел 5. Значит в файл boxes.out выводим 5. Надеюсь понятно объяснил)
PythonOrangutang
Ах да, использованные числа не должны повторяться и m это кол-во строк не считая первой (в данном примере 10)
Rodegast
Вот как надо такое решать:
 >>> n = 20
>>> s = """3
... 9
... 4
... 2
... 5
... 47
... 2
... 12
... 9
... 6"""
>>> i = 0
>>> for m, x in enumerate(sorted(set(map(int, s.split())))):
...     if i >= n:
...         break
...     i += x
>>> m
5
PythonOrangutang
 i = open('boxes.in', 'r')
line = i.read().splitlines()
n = str(line[0]).split()[0]
del line[0]
s = """3
9
4
2
5
47
2
12
9
6"""
print(min(line))
counter = 1
counter2 = 0
counter3 = 0
p = 0
for m, x in enumerate(sorted(set(map(int, s.split())))):
	if str(counter) >= n:
		break
	counter += x
i.close()
o = open('boxes.out', 'w')
o.write(str(m))
o.close()
Не правильно работает. И еще подскажи как автоматически придать такое значение переменной s.
Rodegast
> Не правильно работает.

Попробуй так
 m = p = 0
for x in sorted(set(map(int, s.split()))):
	if p >= n:
		break
	p += x
        m += 1
> И еще подскажи как автоматически придать такое значение переменной s.

Что значит автоматически? Просто считываешь файл и всё.
PythonOrangutang
Rodegast
> Не правильно работает.Попробуй так
 i = open('boxes.in', 'r')
line = i.read().splitlines()
n = str(line[0]).split()[0]
del line[0]
s = """3
9
4
2
5
47
2
12
9
6"""
print(min(line))
counter = 1
counter2 = 0
counter3 = 0
m = p = 0
for x in sorted(set(map(int, s.split()))):
	if str(counter) >= n:
		break
	counter += x
	m += 1
i.close()
o = open('boxes.out', 'w')
o.write(str(m))
o.close()
Вывод тот же. 1. Уже и не знаю что гуглить…
Rodegast
 if str(counter) >= n:
PythonOrangutang
 i = open('boxes.in', 'r')
line = i.read().splitlines()
n = str(line[0]).split()[0]
del line[0]
s = line
counter = 1
counter2 = 0
counter3 = 0
m = p = 0
for x in sorted(set(map(int, s.split()))):
	if counter >= int(n):
		break
	counter += x
	m += 1
i.close()
o = open('boxes.out', 'w')
o.write(str(m))
o.close()
Выдает ошибку:
for x in sorted(set(map(int, s.split()))):
AttributeError: ‘list’ object has no attribute ‘split’.
 s=['3', '9', '4', '2', '5', '47', '2', '12', '9', '6']
если записать s как
 s = """3
9
4
2
5
47
2
12
9
6"""
то вывод правильный. Но как исправить ошибку?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB