簡體   English   中英

在列表理解中出現錯誤-python

[英]Getting error in list comprehension - python

出現此代碼錯誤(SyntaxError:語法無效)

score = [a*a in range(1, 100) if (a*a)%2 is 0 and str(a*a)[-1] is '0']
print(score)

結果:

SyntaxError: invalid syntax

但是當我使用沒有列表理解方法的代碼時,相同的代碼工作正常。

score = []
for a in range(1,100):
    if (a*a)%2 is 0 and str(a*a)[-1] is '0':
        score.append(a*a)
print(score)

結果:

[100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100]

您錯過for a 另外,您應該使用==測試int和字符串是否相等,因為is檢查對象身份:

score = [a*a for a in range(1, 100) if (a*a) % 2 == 0 and str(a*a)[-1] == '0']

您也可以將== 0縮短為bool檢查,通常考慮使用endswith進行更可靠的后綴檢查:

score = [a*a for a in range(1, 100) if not (a*a) % 2 and str(a*a).endswith('0')]

請參閱清單推導中的文檔

問題是表達式的yield部分:

score = [a in range(1, 100) if (a*a)%2 is 0 and str(a*a)[-1] is '0']

您想要將a*a添加到列表中,因此:

score = [a*a for a in range(1, 100) if (a*a)%2 is 0 and str(a*a)[-1] is '0']

但是代碼非常笨拙。 您使用is是引用相等。 盡管大多數解釋器會緩存字符和較小的整數,但是依賴於它會有點冒險:要使程序正常運行,必須滿足的假設越多,出錯的可能性就越大。

此外,可以通過檢查(a*a)%10 == 0來檢測a*a是否以0結尾。 由於102的倍數,因此我們甚至可以刪除第一張支票。 我們可以檢查整數i是否為零而not i (這是True如果i == 0 )。

因此,更安全,更短的解決方案是:

score = [a*a for a in range(1, 100) if not (a * a) % 10]

然后產生:

>>> [a*a for a in range(1, 100) if not (a * a) % 10]
[100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM