В условиета на задачата се казва, че seq е списък. Моя въпрос за итератори беше по-скоро от любопитство.
Коментара обяснява (tongue in chick) причината за съществуването на този ред, въпреки условието на задачата.
Не виждам какво общо има истинността на коментара с кода.
В условиета на задачата се казва, че seq е списък. Моя въпрос за итератори беше по-скоро от любопитство.
Коментара обяснява (tongue in chick) причината за съществуването на този ред, въпреки условието на задачата.
След като забранихте импортирането, предполагам вече не е проблем да попитам:
Има ли разлика между резултата, който нашата реализация на reduce
трябва дава, и резултата от извикването на functools.reduce
със
идентични аргументи?
(Най-вече ме интересува резултата от functools.reduce(lambda x , y : x
+ y, [])
както и дали мога да и се доверя за собственото ми тестване на
решението)
PS. Даде ми грешка при първия опит за 'публикуване'
Митко вече отговори по-нагоре в треда, че ако seq е празен p2.reduce трябва да върне init.
Така че p2.reduce(foo, []) и functools.reduce(foo, []) се различават, първото връща None (init), а второто хвърля изключение.
Мисля, че при всички останали случаи резултата трябва да е идентичен.
На
reduce
ще се дават неща, които могат да се обърнат до списък, да :)
Ако в някое условие е казано -
... над списъка с операнди
seq
...
Нещо се обърквам. Не е редно условието да казва, че е списък, ако ще се подават неща, които не са списък.
Нещо се обърквам. Не е редно условието да казва, че е списък, ако ще се подават неща, които не са списък.
И никой не твърди обратното, списъците могат да се обръщат до списъци.
Да, това е така. Така малко се обесмисля казаното, но важното е, че е ясно. Благодаря.
Всъщност грешката е моя.
В кода на reduce
ползвам len
за проверка дали
seq
е празен. Заради името на seq
, предположих, че е
итератор (too much f# damage) и ми светна, че len
не е гарантирано
да работи върху итератори. Откъдето и произтече не съввсем смислената
дискусия.
Спи спокойно, seq е list. =-)
init само един елемент ли е или може да е списък от елементи, или пък нещо друго? Например може ли да са две числа, а не само едно? Освен това може ли да конкатенираме init и seq в нов списък или по този начин модифицираме seq?
init може да е всичко. Зависи как направиш конкетанирането може да модифицираш seq или пък да създадеш нов списък който е различен от seq. Въпреки че това не ти е нужно.
SPAM: Славомир, tongue in chick е нещо много хубаво, ама май си искал да кажеш tongue in cheek или на български с половин уста :)
Грешка на езика =-)
Има ли някакъв друг начин за добавяне на един елемент към списък, различен от append(), т.е. нещо като list(2), защото това последното не става. Отнася се за първа задача, понеже решението много зависи от това какво е item, понеже може да е всичко-речник, списък и т.н., но може и да е само едно число и само с едно решение не става, защото само едно число не може да се преобразува в списък с list(). Освен ако няма начин да се каже "if item е само един елемент"? Така че ако няма начин за това, грешно ли е да решим задачата само в случая, когато item е само един елемент?
Доколкото разбрах ти трябва израз, който ако item (под което предполагам имаш
предвид init) е списък връща същия списък, а ако е нещо друго връща списък с
един елемент - item. Това може да го напишеш така: item if type(item) ==
list else [item]
. Но не виждам защо ти е в задачата reduce, тъй като там,
ако init е списък не се залепя отпред поелементно ами си се третира като един
елемент. Тоест, ако seq е [1, 2, 3], а init е 5, трябва да работиш все едно с
[5, 1, 2, 3], но ако init е [5, 6], работиш с [[5, 6], 1, 2, 3].
Има ли някакъв друг начин за добавяне на един елемент към списък, различен от append(), т.е. нещо като list(2), защото това последното не става.
Много са, ето някои, които сме споменавали:
>>> l = [1, 2, 3]
>>> l.extend([1])
>>> l
[1, 2, 3, 1]
>>> l.insert(0, 0)
>>> l
[0, 1, 2, 3, 1]
>>> l[:0] = [1]
>>> l
[1, 0, 1, 2, 3, 1]
Отнася се за първа задача, понеже решението много зависи от това какво е item, понеже може да е всичко-речник, списък и т.н., но може и да е само едно число и само с едно решение не става, защото само едно число не може да се преобразува в списък с list(). Освен ако няма начин да се каже "if item е само един елемент"? Така че ако няма начин за това, грешно ли е да решим задачата само в случая, когато item е само един елемент?
Предполагайки, че item
е init
, Ясен ти е отговорил
достатъчно ясно - не ти трябва да знаеш дали е списък, n-торка...
init
, ако го има, просто се поставя като елемент преди първия на
seq
и над резултата прилагаш dyad
съгласно
условието.
P.S. само да напомня че не трябва да променяш обекта с име seq
,
който ти е подаден към reduce
Благодаря много:)
Последно, това, което ми трябва е как да напиша точно това: "ако init е един елемент"?
Последно, това, което ми трябва е как да напиша точно това: "ако init е един елемент"?
Все още грешно го разбираш, представи си:
reduce(lambda x, y: x + y, [[1], [2]], [0])
Сега следвайки твоята логика ще се получи "reduce(lambda x, y: x + y,
[0, [1], [2]])
", което е грешно - правилното е "reduce(lambda x, y:
x + y, [[0], [1], [2]])
"
Ами разбрах общо взето, че, дори и да е списък, пак се гледа на него като на един елемент,така ще го направя последно, и после ще видим дали правилно съм разбрала.