【问题标题】:List comprehensions with multiple conditions列出具有多个条件的推导
【发布时间】:2017-04-07 14:21:03
【问题描述】:

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

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

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

【问题讨论】:

  • 你的理解不可读,为什么不使用常规的 for 循环
  • 您的import'0123456789' 分配给lettersdigits
  • 使用range() 获取您想要的数字并使用itertools.product 组合它们

标签: python list-comprehension multiple-conditions


【解决方案1】:

我发现了一些问题。

首先,您的导入并没有按照您的想法进行:

>>> 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

第三,我同意其他人说这不容易阅读/理解的观点。以不同的方式编写它,使用循环或范围或函数表示法,或者至少以不同的方式对其进行格式化以使结构更加明显,这将是一种改进。

希望这会有所帮助。

【讨论】:

  • 非常感谢您的回复。我根据您的反馈修改了代码,现在它可以工作了! :)
  • 太棒了,很高兴为您提供帮助! (如果您满意,可以“接受”我的回答。)
【解决方案2】:

您正在尝试对包含数字的字符串进行整数模运算。我猜digitFOO % 2 == 0int(digitFOO) % 2 == 0 一样换行。

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

【讨论】:

    【解决方案3】:

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

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

    你还应该把你的代码布局得更好——长的单行是行不通的!

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多