列出具有多个条件的理解
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
是一个字符串,所以每个digit1
和digit2
也是一个(单字符)字符串。这使得(例如)digit1 % 2
似乎是在尝试使用 Python 的字符串插值机制——它是一个带有字符串左侧操作数的 %
运算符。
因为该操作数不包含 %
符号,所以没有标记来定位右侧操作数 2
的插入,因此出现了相当难以理解的错误消息。
您还应该更好地布局您的代码 - 长的单行行不通!
我知道这个主题已经被触及过几次,但我检查的所有主题都没有问我要问的问题(我认为)。下面的声明有什么问题?
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
是一个字符串,所以每个digit1
和digit2
也是一个(单字符)字符串。这使得(例如)digit1 % 2
似乎是在尝试使用 Python 的字符串插值机制——它是一个带有字符串左侧操作数的 %
运算符。
因为该操作数不包含 %
符号,所以没有标记来定位右侧操作数 2
的插入,因此出现了相当难以理解的错误消息。
您还应该更好地布局您的代码 - 长的单行行不通!