列出具有多种条件的理解

时间:2017-04-07 14:21:04

标签: python list-comprehension 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

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

3 个答案:

答案 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是一个字符串,因此每个digit1digit2也是一个(单字符)字符串。这使得(例如)digit1 % 2似乎是尝试使用Python的字符串插值机制 - 它是一个带有字符串左操作数的%运算符。

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

您还应该更好地编写代码 - 长单行不起作用!