Опитвам се да науча разбирането на Питон, но аз се заклещвам. Опитвам се да увелича 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])
Не забравяйте, че това е списък разбиране; не можете да добавяте произволни действия, като например присвояване.