Pull to refresh

Comments 30

Попробовал
import math
Получил
ImportError: __import__ not found
Это даже не смешно. Могли бы оставить.
help() вводит в ступор: Unknown error: Please email a bug report to philip@pgbovine.net
dir() не определен.
Ну это совсем не интересно…

Кароче юзать как онлайн дебагер не получится. Я думал гораздо лучше будет это все.
как раз хотел начать изучать, но платформа их довольно скудна на данный момент, придется самому все изучать досконально
Там на гитхабе написано что оттуда выкинули всё что можно и поставили ограничение в 200 шагов, что бы не использовали как дебаггер. Ну и сам питон там не на js написан, а кидает аяксом код на сервер, тот исполняет и возвращает все состояния памяти на всех шагах. Для обучения посмотреть что происходит в памяти — это же прекрасно.
Уверен это интересно тем, кто пайтон видел только на картинках (типа меня).
На сайте сайте лежит задачка:
Two-sum
Write a function to return the sum of the two largest elements in the given list (assuming you're given a list with at least two elements).
Hint: Can you find the largest element? How about the second largest? Or think about sorting.
Solution: Scan through the list twice to find the two largest elements, then sum them (or sort and sum the two largest elements).


Не пойму, зачем нужно проходить лист два раза? Сортировать тоже, насколько понимаю, не обязательно.
Разве такой код (ниже) не решает задачу?
def sumTwoLargest(lst):
    max = -9223372036854775807
    prevMax = max
    for el in lst:
        if max < el:
            prevMax = max
            max = el
        else:
            if prevMax < el:
                prevMax = el
    return max+prevMax
может они хотели что нибудь вроде:
def sumTwoLargest(lst):
    return sorted( lst )[::-1][0]
извиняюсь, невнимательно прочитал условие, но решение не сильно отличается (без проверок)
def sumTwoLargest(lst):
    return sum( sorted( input )[-2:] )
Вас не смущает, что сортировка «слегка медленнее», чем поиск 2-х максимальных чисел в списке? Как бы O(N*logN) и О(N) соответственно.
А есть какие то требования? пока я увидел массив и пяти элементов. Я согласен что пробежаться по массиву это быстрее, но в данном случае, очевидно, что незачем городить огород для академических задачек в две строки.
К стати а вы пробовали проверять решения на время работы?, т.е. прежде чем возражать я думаю должны были попробовать не так ли? Как это ни странно, но короткое решение оказалось в два раза быстрее по скорости работы.
Python 2.6.5
для первого решения время :
real 0m1.905s
user 0m1.840s
sys 0m0.068s
для второго решения время :
real 0m0.881s
user 0m0.748s
sys 0m0.092s
строка запуска print sumTwoLargest( range( 1, 10000444 ))

в общем ни к чему споры, python это не си и даже не с++, и скорость работы встроенных функций может подкидывать классные загадки.
По-честному надо перемешивать (shuffle) массив, подаваемый на сортировку. Однако, это не даёт существенных отличий.
Не программирую на питоне.
Если я правильно понимаю, range(a,b) возвращает отсортированный по возрастанию лист. Маны говорят, что
First the trivial cases, trivial for samplesort because it special-cased
them, and trivial for timsort because it naturally works on runs. Within
an «n» block, the first line gives the # of compares done by samplesort,
the second line by timsort, and the third line is the percentage by
which the samplesort count exceeds the timsort count:

На той же странице мана можно увидеть время работы сортировки на отсортированном наборе. Насколько понимаю, сложность в таком случае — O(n), т.е. подобная сложности варианта с одним проходом по массиву. Т.е. мы видим отношение констант.
Если набор будет случайным, какие будут результаты? :)
Наверное вы правы, сортированный список сокращает время работы, поэтому и получилось быстрее. По моему все это offtopic и продолжать не вижу смысла. Понятно что с чисто алгоритмической точки зрения в однопроходном варианте меньше приседаний.
Да, скорее всего. Курс, ведь, про Python, а не алгоритмы.
Берите max = lst[0], так надежнее.
На наборе, упорядоченном по убыванию, ломается.
Вообще, вместо этого магического числа я хотел написать -sysmaxint, но импорт sys на том сайте не работает.
max = lst[1]
prevMax = lst[0]

так работает
Нет, сорри, и тут есть неработающие варианты. Подумаю еще.
угу. Но чем вас не устраивает -sysmaxint? По-моему, безопасно и понятно. :)
Это идеологически неправильно — рассчитывать на какие-то умолчания.
def sumTwoLargest(lst):
prevMax = max = None
for el in lst:
if max < el:
prevMax = max
max = el
else:
if prevMax < el:
prevMax = el
print max, prevMax,
return max, prevMax

print sumTwoLargest([9,8,7,6,5,4,3]) == (9, 8)
print sumTwoLargest([3, 4, 5, 6, 7, 8, 9]) == (9, 8)
print sumTwoLargest([3, 5,7,8,3,2,4,7,9,5,6,7,4]) == (9, 8)
print sumTwoLargest([11, 12,7,8,3,2,4,7,9,5,6,7,4]) == (12, 11)
print sumTwoLargest([12, 5,7,8,3,2,4,7,9,5,6,7,4]) == (12, 9)
print sumTwoLargest([12, 11,7,8,3,2,4,7,9,5,6,7,4]) == (12, 11)
print sumTwoLargest([12, 11,7,8,3,2,12,7,9,5,6,7,4]) == (12, 12)
print sumTwoLargest([12, 7,8,3,2,4,7,9,5,6,7,11]) == (12, 11)
print sumTwoLargest([11, 7,8,3,2,4,7,9,5,6,7,4, 12]) == (12, 11)

Про None не знал, спасибо. :)
UFO just landed and posted this here
>>> True = False
>>> True or False
False
>>> True is False
True
True, False = False, True
его легко затроллить
x = 5
def foo(y):
  def bar():
    for i in range(x,y):
      yield i
  return bar

it = foo(7)    
for z in it():
  print z
на самом деле yield не умеет.
с замыканием всё нормально.

Sign up to leave a comment.

Articles