Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 7, 2014 17:13:36

lindsay
Зарегистрирован: 2014-11-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по list comprehensions и аналог ф-ции ?() + еще кое что

делаю google python excercises.
есть вопросы ( помогите, только начал учить python 2.7 3 дня как)
почему

for n in nums:
 if nums.count(n)>1:
  nums.remove(n)
работает правильно а (хоть и сказано в заданиях такое не использовать, мое верхнее решение правильное)
 [nums.remove(n) for n in nums if nums.count(n) > 1] 
возвращает пустой список.

2. есть ли в python аналог функции ?(1=1,y,n) которая вернет “y” в данном случае?

3.мне непонятно задание
# E. Given two lists sorted in increasing order, create and return a merged
# list of all the elements in sorted order. You may modify the passed in lists.
# Ideally, the solution should work in “linear” time, making a single
# pass of both lists.
def linear_merge(list1, list2):
# +++your code here+++
return

# Note: the solution above is kind of cute, but unforunately list.pop(0)
# is not constant time with the standard python list implementation, so
# the above is not strictly linear time.
# An alternate approach uses pop(-1) to remove the endmost elements
# from each list, building a solution list which is backwards.
# Then use reversed() to put the result back in the correct order. That
# solution works in linear time, but is more ugly.

я написал его как
(понятно что можно заоптимайзить вызовы через “.” но дело не в этом)
i=0
m = []
while list2.count()+list1.count()>0:
  i -= 1
  if list1.count()>0:
    m.append(list1.pop(i))
  if list2.count()>0:
    m.append(list2.pop(i))
а дальше не пойму что имеется ввиду с реверсом, то ли метод обьекта list вызывать, или встроенный.
Но для обеих функций сортировка не поидет, для заданных условий:
test(linear_merge(['aa', 'xx', 'zz'], ['bb', 'cc']),
       ['aa', 'bb', 'cc', 'xx', 'zz'])
test(linear_merge(['aa', 'xx'], ['bb', 'cc', 'zz']),
       ['aa', 'bb', 'cc', 'xx', 'zz'])
test(linear_merge(['aa', 'aa'], ['aa', 'bb', 'bb']),
       ['aa', 'aa', 'aa', 'bb', 'bb'])
и если sort или sorted вызывать то неясно зачем реверс вообще.

Отредактировано lindsay (Ноя. 7, 2014 17:22:12)

Офлайн

#2 Ноя. 7, 2014 21:44:03

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

вопрос по list comprehensions и аналог ф-ции ?() + еще кое что

1. Вы создаете новый список этой операцией. По идее, у вас должен быть не пустой list, а состоять из None.
2. result = y if 1=1 else n
3. Тут идет речь о сложности алгоритма. Операция pop() возвращает первый элемент из списка и удаляет его оттуда. В результате чего, все элементы в list сдвигаются влево. Если делать pop(-1), то вернется последний элемент, и ничего сдвигаться не будет. Но в таком случае, у вас получиться новый список отсортированный в обратном порядке. Чтобы отсортировать его по возрастанию, предлагают использовать метод reversed(my_list)

Офлайн

#3 Ноя. 7, 2014 23:45:01

lindsay
Зарегистрирован: 2014-11-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по list comprehensions и аналог ф-ции ?() + еще кое что

GreyZmeem
1. Вы создаете новый список этой операцией. По идее, у вас должен быть не пустой list, а состоять из None.
Так и есть, none. Не могу понять почему, на мой взгляд должно делать то же, что и развернутый цикл выше. Не могли бы обьяснить как работает алгоритм в данном случае. Меня именно жто интересует.

GreyZmeem
3. Тут идет речь о сложности алгоритма. Операция pop() возвращает первый элемент из списка и удаляет его оттуда. В результате чего, все элементы в list сдвигаются влево. Если делать pop(-1), то вернется последний элемент, и ничего сдвигаться не будет. Но в таком случае, у вас получиться новый список отсортированный в обратном порядке.
Это понятно, я и сделал с -1 итерацию потому.
кстати напутал с кодом вначале. разумеется, должно быть так:
m=0
while len(list1)+len(list2)>0:
  if len(list1)>0:
    m.append(list1.pop(-1))
  if len(list2)>0:
    m.append(list2.pop(-1))
m.reverse()
return m
GreyZmeem
Чтобы отсортировать его по возрастанию, предлагают использовать метод reversed(my_list)
И это как бы тоже понятно, только вот builtin ф-ция reversed(m) у меня возвращает указатель на обьект итератор или что то в этом роде. Но это видимо обращение к процедуре как к функции потому что. Но даже после отработки reversed(m) порядок не меняется…

Метод list.reverse() реверсит, но для вариантов с данными входящими параметрами
реверс не упорядочивает нормально все равно, т.к. элементы списка не упорядочены при обьединении.
потому и говорю что непонятно, что они имеют ввиду. без sort или sorted не обойтись?

Отредактировано lindsay (Ноя. 8, 2014 00:14:11)

Офлайн

#4 Ноя. 8, 2014 02:54:48

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

вопрос по list comprehensions и аналог ф-ции ?() + еще кое что

nums.remove(n) - это один из методов списка, он изменяет список на месте, т.е. его задача выполнить действие, а не возвратить какое-то значение. Как и любая функция, возвращает None по-умолчанию, если не прописано что-то иное.

[n for n in nums  if nums.count(n) > 1]
как выше сказали, это уже новый список, созданный на основе nums, сам nums остался без изменений.
этот код
[nums.remove(n) for n in nums if nums.count(n) > 1]
изменяет (или пытается) nums, но полученный список практически бесполезен, он будет состоять из None (либо пустой, в зависимости от выполнения хотя бы раз условия nums.count(n) > 1)

Офлайн

#5 Ноя. 8, 2014 03:14:10

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

вопрос по list comprehensions и аналог ф-ции ?() + еще кое что

lindsay
Так и есть, none. Не могу понять почему, на мой взгляд должно делать то же, что и развернутый цикл выше. Не могли бы обьяснить как работает алгоритм в данном случае. Меня именно жто интересует.
Синтаксис примерно такой:
new_list = [expression for item in old_list]
Где “expression” может быть методом который принимает переменную item как аргумент и возвращает значение. Или просто какая-то операция над этим item. Результат этого “expression” попадет в новый список.
Например возвести все числа в квадрат:
>>> my_list = [1, 2, 3, 4]
>>> [item*item for item in my_list]
[1, 4, 9, 16]
>>>
>>> def item_pow(item):
...  return item*item
...
>>> [item_pow(item) for item in my_list]
[1, 4, 9, 16]
>>>
Также можно фильтровать значения который будут попадать в “expression”
>>> my_var = 42
>>> div_by = [1, 2, 3, 0, 4]
>>> [my_secret_var/item for item in div_by]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>>
>>> [my_secret_var/item for item in div_by if item != 0]
[42, 21, 14, 10]
>>>
Т.е. у вас в новый список попало то, что вернул метод nums.remove(n), а он ничего не возвращает. Потому у вас None.

lindsay
И это как бы тоже понятно, только вот builtin ф-ция reversed(m) у меня возвращает указатель на обьект итератор или что то в этом роде.
Да, так и есть. Обязательно прочитайте что это такое.

lindsay
Метод list.reverse() реверсит, но для вариантов с данными входящими параметрами
реверс не упорядочивает нормально все равно, т.к. элементы списка не упорядочены при обьединении.
потому и говорю что непонятно, что они имеют ввиду. без sort или sorted не обойтись?
Вы видно неправильно поняли задачу. У вас есть два упорядоченных списка. Вам нужно их объединить так, чтобы на выходе получиться один список и тоже упорядоченный. У вас же код, просто объединяет два списка без сортировки. Он берет попарно из каждого списка по значению и запихивает их в другой список.

Офлайн

#6 Ноя. 9, 2014 20:11:00

lindsay
Зарегистрирован: 2014-11-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по list comprehensions и аналог ф-ции ?() + еще кое что

как выяснилось, явно получать чаркод для сравнения не надо. Люблю Python!

m = []
while len(list1) and len(list2):
  if list1[-1] > list2[-1]:
    m.append(list1.pop[-1])
  else:
    m.append(list2.pop[-1])    
m += list1
m += list2
m.reverse()
return m

Отредактировано lindsay (Ноя. 9, 2014 21:35:31)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version