Предупреждение: Ще бъда много конкретен и строг в този коментар. Защо ? Тъй като статиите се четат от много хора и грешките трябва да се коригират, за да се избегнат заблуди на новодошлите. Също така, това не е първият път, когато коригирам много точки в една от вашите статии. Помислете да помолите колеги за рецензия, преди да публикувате. Ако не е възможно, можете да се свържете с мен в 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()отfunctools е създаден за това:

reduce(lambda x, y: x + y, li)

#60:

Обърнете реда на списък с помощта на синтаксиса на срез

Създаването на обърнат списък с помощта на синтаксиса на срез е по-добро поради същата причина, която се вижда няколко точки по-горе.