我知道这个主题已经被触及了几次,但我检查的所有主题都没有问我要提出的问题(我认为)。下面的声明有什么问题?
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
很高兴知道我做错了什么,因为我可以发誓我在这里遵循正确的语法......
答案 0 :(得分:2)
我看到了一些问题。
首先,您的导入不符合您的想法:
>>> 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
第三,我同意其他人说这不容易阅读/理解。以不同的方式编写,使用循环或范围或功能表示法,或者至少对其进行不同格式化以使结构更加明显,这将是一种改进。
希望这有帮助。
答案 1 :(得分:0)
您正在尝试对包含数字的字符串执行整数mod。我想像digitFOO % 2 == 0
一样包裹int(digitFOO) % 2 == 0
。
正如Chris_Rands指出的那样,它仍然无法正常工作,因为进口已经破裂。
答案 2 :(得分:0)
这里的问题是您导入的digits
是一个字符串,因此每个digit1
和digit2
也是一个(单字符)字符串。这使得(例如)digit1 % 2
似乎是尝试使用Python的字符串插值机制 - 它是一个带有字符串左操作数的%
运算符。
因为该操作数不包含%
符号,所以没有标记来定位右侧操作数2
的插入,因此这是一个相当难以理解的错误消息。
您还应该更好地编写代码 - 长单行不起作用!