列出具有多个条件的理解

List comprehensions with multiple conditions

我知道这个主题已经被触及过几次,但我检查的所有主题都没有问我要问的问题(我认为)。下面的声明有什么问题?

from string import ascii_letters, digits as letters, digits

combinations = [letter1 + letter2 + digit1 + digit2 for digit1 in digits if (digit1 % 2 == 0) for digit2 in digits if (digit2 % 2 == 0) for letter1 in letters if (letter1 != 'a') for letter2 in letters if (letter2 != 'A')]

print combinations[:500]

我不断得到:

TypeError: not all arguments converted during string formatting

很高兴知道我做错了什么,因为我可以发誓我在这里遵循正确的语法...

您正在尝试对包含数字的字符串执行整数 mod。我想把 digitFOO % 2 == 0 包装成 int(digitFOO) % 2 == 0.

正如 Chris_Rands 指出的那样,它仍然无法正常工作,因为导入已损坏。

我看到了一些问题。

首先,您的导入并不像您认为的那样:

>>> from string import ascii_letters, digits as letters, digits
>>> letters
'0123456789'
>>> digits
'0123456789'

试试这样的方法?

>>> from string import ascii_letters as letters, digits as digits
>>> letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> digits
'0123456789'

其次,当您在数字上使用 % 运算符时,它是 mod,但是当您在字符串上使用它时,它是 format 运算符。您在字符串上使用它,因此关于字符串格式的含糊不清。如果你想让它成为 mod 运算符,你必须 int() 你正在使用它的东西。

int(digit1) % 2

第三,我同意其他人说这不容易read/understand。以不同的方式编写,使用循环或范围或函数符号,或者至少以不同的方式格式化以使结构更明显,将是一种改进。

希望这对您有所帮助。

这里的问题是你导入的digits是一个字符串,所以每个digit1digit2也是一个(单字符)字符串。这使得(例如)digit1 % 2 似乎是在尝试使用 Python 的字符串插值机制——它是一个带有字符串左侧操作数的 % 运算符。

因为该操作数不包含 % 符号,所以没有标记来定位右侧操作数 2 的插入,因此出现了相当难以理解的错误消息。

您还应该更好地布局您的代码 - 长的单行行不通!