Форум сайта python.su
0
делаю 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]
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))
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'])
Отредактировано lindsay (Ноя. 7, 2014 17:22:12)
Офлайн
34
1. Вы создаете новый список этой операцией. По идее, у вас должен быть не пустой list, а состоять из None.
2. result = y if 1=1 else n
3. Тут идет речь о сложности алгоритма. Операция pop() возвращает первый элемент из списка и удаляет его оттуда. В результате чего, все элементы в list сдвигаются влево. Если делать pop(-1), то вернется последний элемент, и ничего сдвигаться не будет. Но в таком случае, у вас получиться новый список отсортированный в обратном порядке. Чтобы отсортировать его по возрастанию, предлагают использовать метод reversed(my_list)
Офлайн
0
GreyZmeemТак и есть, none. Не могу понять почему, на мой взгляд должно делать то же, что и развернутый цикл выше. Не могли бы обьяснить как работает алгоритм в данном случае. Меня именно жто интересует.
1. Вы создаете новый список этой операцией. По идее, у вас должен быть не пустой list, а состоять из None.
GreyZmeemЭто понятно, я и сделал с -1 итерацию потому.
3. Тут идет речь о сложности алгоритма. Операция pop() возвращает первый элемент из списка и удаляет его оттуда. В результате чего, все элементы в list сдвигаются влево. Если делать pop(-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И это как бы тоже понятно, только вот builtin ф-ция reversed(m) у меня возвращает указатель на обьект итератор или что то в этом роде. Но это видимо обращение к процедуре как к функции потому что. Но даже после отработки reversed(m) порядок не меняется…
Чтобы отсортировать его по возрастанию, предлагают использовать метод reversed(my_list)
Отредактировано lindsay (Ноя. 8, 2014 00:14:11)
Офлайн
nums.remove(n) - это один из методов списка, он изменяет список на месте, т.е. его задача выполнить действие, а не возвратить какое-то значение. Как и любая функция, возвращает None по-умолчанию, если не прописано что-то иное.
[n for n in nums if nums.count(n) > 1]
[nums.remove(n) for n in nums if nums.count(n) > 1]
Офлайн
34
lindsayСинтаксис примерно такой:
Так и есть, none. Не могу понять почему, на мой взгляд должно делать то же, что и развернутый цикл выше. Не могли бы обьяснить как работает алгоритм в данном случае. Меня именно жто интересует.
new_list = [expression for item in old_list]
>>> 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] >>>
>>> 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] >>>
lindsayДа, так и есть. Обязательно прочитайте что это такое.
И это как бы тоже понятно, только вот builtin ф-ция reversed(m) у меня возвращает указатель на обьект итератор или что то в этом роде.
lindsayВы видно неправильно поняли задачу. У вас есть два упорядоченных списка. Вам нужно их объединить так, чтобы на выходе получиться один список и тоже упорядоченный. У вас же код, просто объединяет два списка без сортировки. Он берет попарно из каждого списка по значению и запихивает их в другой список.
Метод list.reverse() реверсит, но для вариантов с данными входящими параметрами
реверс не упорядочивает нормально все равно, т.к. элементы списка не упорядочены при обьединении.
потому и говорю что непонятно, что они имеют ввиду. без sort или sorted не обойтись?
Офлайн
0
как выяснилось, явно получать чаркод для сравнения не надо. Люблю 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)
Офлайн