Предупреждение: Ще бъда много конкретен и строг в този коментар. Защо ? Тъй като статиите се четат от много хора и грешките трябва да се коригират, за да се избегнат заблуди на новодошлите. Също така, това не е първият път, когато коригирам много точки в една от вашите статии. Помислете да помолите колеги за рецензия, преди да публикувате. Ако не е възможно, можете да се свържете с мен в twitter @grenouille_py и може да ви помогна в бъдеще за подобни неща.
Въпреки това може да изглеждам малко (може би) ядосан. Извинявам се точно сега за това, просто прекарвам дни в относително или напълно грешни курсове/уроци по python и това отнема енергията ми да остана спокоен. Много от вашите въпроси и отговори са страхотни и могат да помогнат на някои хора.
Но много от тях не го правят и може да не помогнат, ако не и подвеждащи. Знаете какво е pythonic, но не достатъчно.
Обяснявам защо вашите въпроси/отговори понякога имат известна липса на информация, точност, понякога неправилни думи, но правилно съдържание, или правилни думи, но неправилно съдържание. И т.н.:
#3:
списък позволява дублиращи се стойности, докато речник не позволява дублирани ключове.
Вярно, но без значение, напълно различна структура на данните. По-разумно е да сравнявате списък с кортеж или набор (което не позволява дублирани СТОЙНОСТИ).
Използвайте речник, ако искате да преброите срещанията на нещо.
Можете, но това е много специфичен начин за използване на dict. Твърде конкретно. Вижте dict повече като инструмент за структуриране на данни. Със структура можете да съхранявате това, което искате. И създайте каквото и да било. Обяснете това, вместо да давате твърде тесен пример.
#6:
.extend()
добавя всяка стойност от втория списък като свой собствен елемент.
Не, той добавя всяка стойност от итерируем обект, като списък, кортеж, dict и т.н.
#7:
Списъците на Python не съхраняват самите стойности. Те съхраняват указатели към стойности, съхранени другаде в паметта. Това позволява списъците да бъдат променливи.
Това не позволява списъкът да бъде променлив. Той ви позволява да взаимодействате само с оригиналния обект. Същото с кортежа, който изобщо не е променлив.
#8:
del
премахва елемент от списък с дадения му индекс.
Да, но не само. Подобно на dict, можете да направите това с del
, но това е по-общо поведение, което ви позволява да направите това. Въпросът трябва да бъде „Какво прави del
ключовата дума на python с елемент от списък с дадения му индекс?“. Отговор : същият като .pop()
, но не връща нищо.
И не е конкретно за списък, да, въпросът изглежда твърде много тук.
#9:
Разликата между
pop
иdel
е, чеpop
връща извадения елемент. Това позволява използването на списък като стек.
a = ['a', 'a', 'b', 'b', 'c', 'c']
a.pop(4) #=› 'c'
a #= › ['a', 'a', 'b', 'b', 'c']
Да, може. Но ако казвате, че може да се използва като стек, дайте поне пример, когато използвате списъка като стек (или изобщо не го споменавайте). Тук използвате pop
като del
. Използвайте del
вместо това (бъдете последователни). Или го използвайте като стек (#54).
#10:
Премахване на дубликати от списък
Ако не сте загрижени за поддържането на реда в списъка,
Не. Променете въпроса на „Създайте копие без дубликати от списък (редът няма значение“).
Пред лицето на неяснота, откажете се от изкушението да гадаете.
- pep20, от Тим Питърс
Защото всъщност, за да премахнете дубликати от списък (което е подредена структура от данни, така че без точност, вие искате да я запазите подредена. + премахването на елементи от списък може да означава запазване на същия обект от списък, а не създаване на плитко копие ), трябва да направите това:
li = [3, 2, 2, 1, 1, 1] len_li = len(li) - 1 for i, e in enumerate(li[::-1]): i = len_li - i if e in li[:i]: del li[i] print(li) #=> [3, 2, 1], Same list, same order
#12:
Или с
del
.
Не. Недей.
Трябва да има един - и за предпочитане само един - очевиден начин да го направите.
- pep20, от Тим Питърс
Между
fruit.clear()
и
del fruit[:]
никога не избирай del
.
#23:
Докато списъците често се използват за проследяване на реда, наборите често се използват за проследяване на съществуването.
Така-така... Предпочитам да кажа, че списъкът се използва по-често за итерация на променлива последователност от елементи, защото ако не е нужно да проследявате реда, може да се наложи да итерирате през списъка. Ако не искате да го итерирате, тогава не е нужно да поддържате ред (в „необходимост от итерация“, изпращане на списъка до функция, която го итерира, е включено, разбира се) и може би просто се нуждаете от набор .
Ако трябва да промените подредена последователност от елементи, използвайте списък. Ако няма нужда да го променяте, използвайте кортеж. Ако няма нужда да го итерирате, използвайте набор.
#25:
Умножете всеки елемент в списъка по 5 с функцията карта
Защо искахте да използвате картата, ако вече знаете как да използвате разбирането?
За да създадете генератор, който умножава всеки елемент в списък (в този случай поискайте генератор, вместо карта), трябва да направите това:
(multiply_5(val) for val in a) # Generator object
Ако искате списък, не правете това:
[val for val in map(multiply_5, a)]
направите това:
[multiply_5(val) for val in a] # List object
#29:
Същото като #25: Защо филтриране? Просто трябва да използвате разбиране (което знаете, защото #38):
(x for x in a if remove_negatives(x)) # for generator [x for x in a if remove_negatives(x)] # for filtered list
#31:
Променете съществуващ списък с ламбда функция
Картата не променя списък, тя само създава обект на карта, който е генератор.
Ако искате да промените списък (и да не създавате нов списък от предишния, модифициран с ламбда функция, трябва да направите това (Но ламбда е безполезна тук, така че не използвайте ламбда):
a = [10,20,30,40,50] b = a for i, e in enumerate(a): a[i] = e * 5 # with lambda : a[i] = (lambda val: val * 5)(e) print(a, a is b) # ([50, 100, 150, 200, 250], True)
Ако искате генератор, не използвайте map, използвайте израз на генератор, но lambda е безполезна тук, така че не използвайте lambda:
(e * 5 for e in a)
Ако искате списък, използвайте разбиране на списък:
[e * 5 for e in a]
На въпроса Как да „Модифицираме съществуващ списък с ламбда функция“? правилният отговор е „Не“.
#32, 33, 34:
Премахване на елементи в списък след/преди определен индекс
Използвайки синтаксиса на срез, можем да върнем нов списък само с елементите до конкретен индекс./Синтаксисът на срез може също да върне нов списък със стойностите след определен индекс.
Тогава това не е „премахване на елементи“, а „създаване на нов списък…“
Чрез „как да премахнете“ можете да разберете, че обектът на списъка все още е същият като първия. Но вие създавате негово плитко копие (защото това е, което прави нарязването), което може да доведе до неочаквано поведение. За да премахнете наистина елементи в списък, използвайте командата del
(за #32 и #33):
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10] del li[15:] # or li[:15]
Пред лицето на неяснота, откажете се от изкушението да гадаете.
- pep20, от Тим Питърс
Същите аргументи за 34-те.
#42:
Комбинирайте елементи в списък в един низ.
Това може да стане с функцията
join()
.
елементи ? Като… 42? Цели числа? Не, имаш предвид струни. След това кажете струни.
#44, 45:
Можем да комбинираме
any()
с разбиране на списък, за да върнемTrue
, ако някоя от стойностите в върнатия списък се оценява наTrue
.
any(i % 2 == 0 за i в li1) #=› Вярно
Това не е разбиране на списък. Не е създаден списък. Това е генераторен израз.
Същото за 45.
#51, 52, 53:
Функцията
min()/max()/sum()
връща минималната/максималната/сумарната стойност в списък.
Тези функции приемат итерируема последователност като аргумент. Тъй като списъкът е итерируема последователност, можем да използваме тези функции, за да получим стойностите min/max/sum.
#57:
Знам, че съм скучен, но отново, PEP20. Разбирането е хубаво нещо, но:
Плоското е по-добре от вложеното.
- pep20, от Тим Питърс
Включено разбиране. Плюс това, свързването на списъци е само li1 + li2.
reduce()
отfunctool
s е създаден за това:
reduce(lambda x, y: x + y, li)
#60:
Обърнете реда на списък с помощта на синтаксиса на срез
Създаването на обърнат списък с помощта на синтаксиса на срез е по-добро поради същата причина, която се вижда няколко точки по-горе.