/ / Увеличаване на променливата при разбиране с изявление if? - python, python-3.x, списък, разбиране на списък

Увеличаване на променливата при разбиране на ако изявление? - python, python-3.x, списък, списък-разбиране

Опитвам се да науча разбирането на Питон, но аз се заклещвам. Опитвам се да увелича count променлива, когато условието е True, и return които се броят след цикъла. Ето моят код:

list = [1,2,4,5,7,8,10]
d = 3
count = 0
return [count for x in range(len(list))
if list[x] + d in list and list[x] + 2 * d in list]

Връща се "0" всеки път, когато състоянието ми е True, Когато се опитам да добавя count += 1 в разбирането това ми дава SyntaxError.

Отговори:

6 за отговор № 1

разбирания Концептуално, те ви позволяват да задавате и филтрирате отделните елементи от списъка, а не да се натрупват в една променлива.

Съществува стандартен идиом за това, че все пак това става. По принцип създавате повторяеми булеви за вашето състояние или просто запазвате тези за всички елементи, които искате и отхвърляте останалите, след това sum над това.

Като допълнително подобрение бих препоръчал да използвате a израз на генератор по-скоро от разбирането на списък. Тя изглежда почти същата, но поддържа ленива оценка. Това означава, че получавате всички предимства на един-единствен лайнер, без да се налага да съхранявате списъка с стойности на флага в паметта.

Ето как ще изглежда първата опция:

L = [1,2,4,5,7,8,10]
count = sum((x + d in L and x + 2 * d in L) for x in L)

Вторият вариант ще изглежда така:

L = [1,2,4,5,7,8,10]
count = sum(1 for x in L if (x + d in L and x + 2 * d in L))

Забележете, че преименувах променливата ви list да се L така че няма да засенчи вградената функция.


3 за отговор № 2

Дон "Т?

for x in lst:
if x+d in lst and x+2*d in lst:
count += 1

Или използвайте len:

count = len([_ for x in lst if x+d in lst and x+2*d in lst])

Или използвайте сумата:

count = sum(1 for x in lst if x+d in lst and x+2*d in lst)

Или използвайте комплекти (подгответе се да бъдете изненадани):

count = len(({x + d for x in lst} | {x + 2 * d for x in lst}) & set(lst))

Ето номерата на изпълнение в списък от 1000 последователни номера:

loop:    20.3 ms ± 8 ms
len:     25.4 ms ± 8.22 ms
sum:     18.3 ms ± 5.06 ms
sets:    272 µs ± 19 µs  (~100x faster)

Това не е гаранция за производителност. В този случай комплектите вероятно са и най-малко ефективното решение.

Също така, не назовавайте променлива list, че е вградена функция в Python и презаписването ще предизвика всички видове хаос.


2 за отговор № 3

Вие сте много близо. Разбирането на списъци не може да съхранява и използва повторно променливите по желания от вас начин; те могат да съдържат само изрази. Едно от решенията е да се използва sum с израз на генератор.

Ползата от това решение е да избегнете разходите за създаване на списък, който не е необходим за преброяване на броя на елементите, отговарящи на дадено условие.

A = [1,2,4,5,7,8,10]
A_set = set(A)

d = 3
count = 0

res = sum(1 for x in range(len(A)) if 
(A[x]+d in A_set) and (A[x]+2*d in A_set))

# 3

Забележете, че никога не трябва да именувате променливите след класовете. Освен това можете да използвате set за O (1) търсене.

Също така имайте предвид, че ние конструираме A_set извън разбирането на списъка, в противен случай ще бъде изчислено за всяка итерация на range(len(A)).


2 за отговор № 4
list = [1,2,4,5,7,8,10]

d = 3

# python 3 required for _
result = len([_ for x in range(len(list))
if list[x]+d in list and list[x]+2*d in list])
# python 2
result = len([1 for x in range(len(list))
if list[x]+d in list and list[x]+2*d in list])

1 за отговор № 5

Ако се нуждаете само от броя на случаите, върнете дължината на списъка:

len([count for x in range(len(list))
if list[x]+d in list and list[x]+2*d in list])

Не забравяйте, че това е списък разбиране; не можете да добавяте произволни действия, като например присвояване.