Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2010 15:47:20

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

Ну и для полноты картины:

def calc_recursion(number, res = 0):
if not number: return res
else: return calc_recursion(number // 10, res + number % 10)
Тут у меня вышло 3.3, то есть примерно 2-е место. Я ожидал худшего.



Офлайн

#2 Сен. 22, 2010 15:52:48

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как найти длину в списке

Варианты с // и % начинают сильно отставать, как только количество цифр в числе увеличивается



Офлайн

#3 Сен. 22, 2010 16:06:54

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

Isem
Варианты с // и % начинают сильно отставать, как только количество цифр в числе увеличивается
Есть такое, но только при варианте с ord, а не с int и знаков должно быть больше 10 (по моим экспериментам).



Офлайн

#4 Сен. 22, 2010 16:20:55

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как найти длину в списке

Ну цифры говорят сами за себя:

def map_int(n):
return sum(map(int, str(n)))

def map_ord(n):
s = str(n)
return sum(map(ord, s)) - len(s)*ord('0')

def calc_numbers1(number):
res = 0
divisor = 1
while divisor < number:
res += (number % (divisor*10)) // (divisor)
divisor *= 10
return res

def calc_numbers2(number):
res = 0
while number:
res += number % 10
number //= 10
return res


for f in map_int,map_ord,calc_numbers1,calc_numbers2:
n = 123456789
start = time()
for i in range(100000):
s = f(n)
print( "time spent for {0} = {1} sec".format( f.__name__, time() - start ))
для n=123456789:

time spent for map_int = 1.187000036239624 sec
time spent for map_ord = 0.26799988746643066 sec
time spent for calc_numbers1 = 0.6729998588562012 sec
time spent for calc_numbers2 = 0.3560001850128174 sec


для n=12345678901234567890:

time spent for map_int = 2.4769999980926514 sec
time spent for map_ord = 0.4119999408721924 sec
time spent for calc_numbers1 = 1.8000001907348633 sec
time spent for calc_numbers2 = 0.8689999580383301 sec

Используется Python 3.2



Отредактировано (Сен. 22, 2010 16:22:17)

Офлайн

#5 Сен. 22, 2010 17:30:40

breidos
От:
Зарегистрирован: 2010-09-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

Посоветуйте, как сделать такое:
Вывести все целые числа от 1 до 100, которые делятся на сумму своих цифр без остатка.
Пишу так, а он ругается :(

n=list(range(10))
print sum(map(int, str(n))),
ПС. Спасибо всем за ответы. Жаль + ставить некуда.



Отредактировано (Сен. 22, 2010 17:31:36)

Офлайн

#6 Сен. 22, 2010 17:40:24

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

breidos,
1. str(n) — это по вашему что?
2. Для начала составьте алгоритм действий. Словами или диаграммами на бумажке, не важно, главное четко понимать КАК вы собираетесь выполнить задачу.

Кстати, может я чего не знаю, но зачем писать n=list(range(10))?
Или в какой-то версии питона xrange заменили на range и теперь range не возвращает list?

P.S. И впредь, насколько я понял правила форума, для новой задачи начинайте новую тему.



Отредактировано (Сен. 22, 2010 17:41:18)

Офлайн

#7 Сен. 23, 2010 03:44:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Как найти длину в списке

maxwell
Или в какой-то версии питона xrange заменили на range
у него код для второго питона, там ещё list
а в третьем питоне нет xrange

>>> xrange
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined
>>> range(10)
range(0, 10)
>>>



Отредактировано (Сен. 23, 2010 03:48:17)

Офлайн

#8 Сен. 23, 2010 09:42:06

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

breidos
Пишу так, а он ругается
Всем, конечно, итак понятно как ОН ругается, но не мешало бы привести текст ошибки и ваше мнение почему так произошло.
И послушайте maxwell, распишите алгоритм на бумажке – подробней распишите действия, которые должна выполнять программа, потом начинайте писать код, глядишь и помощь форума не понадобится :)
breidos
print sum(map(int, str(n))),
Судя по этому, вам не мешало бы для начала книжку по питону для начинающих почитать – узнать, что такое str, int, map, sum и т.д. А то из предыдущих примеров выдернули кусок кода наобум и думаете он будет работать. Чтобы вам помогли, вы должны сами искать решение.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version