【问题标题】:Simply a try/except with lambda - Python? [duplicate]简单地尝试/除 lambda - Python? [复制]
【发布时间】:2013-01-08 05:46:21
【问题描述】:

有没有办法用 lambda 简化这个 try/except 成一行?

alist = ['foo','bar','duh']

for j,i in enumerate(alist):
  try:
    iplus1 = i+alist[j+1]
  except IndexError:
    iplus1 = ""

除了:

j = '' if IndexError else trg[pos] 

【问题讨论】:

  • 那么...你想在这里完成什么?
  • 假设做一些动态编程,我在列表中看到上一个和下一个项目,并根据我将计算的一些收敛做出一些决定。
  • 我认为try/except 下面还有更多代码,对吧?否则循环没有意义,因为iplus1 只会在最后得到最后一个值。但是有一个问题:当您迭代列表时,省略的代码是否会将新值写入列表?这在某些情况下是可行的,但如果你不小心,很容易做错。
  • 不,如果 iplus1 不存在,它仍然是一个空字符串。
  • 我不确定我是否理解你在做什么。在我看来,您的循环相当于if alist: iplus1 = ""。不会看到任何i+alist[j+1] 值,因为它们会相互覆盖,然后在发生异常时被空字符串覆盖(如果alist 不为空,它总是会发生)。

标签: python lambda try-except


【解决方案1】:

不,Python 对 try/except 语法没有任何简写或简化。

为了解决你的具体问题,我可能会使用类似的东西:

for j, i in enumerate(alist[:-1]):
   iplus1 = i + alist[j + 1]

这将避免需要异常。

或者变得超级酷和通用:

from itertools import islice

for j, i in enumerate(islice(alist, -1)):
    iplus1 = i + alist[j + 1]

或者,您可以使用:itertools.iziplongest 来做类似的事情:

for i, x in itertools.izip_longest(alist, alist[1:], fillvalue=None):
    iplus1 = i + x if x is not None else ""

最后,关于命名法的一点小提示:i 传统上用于表示“索引”,因此使用 for i, j in enumerate(…) 会更“正常”。

【讨论】:

  • 您还需要添加最后一个不带后缀的元素。
  • 是的,这肯定需要考虑。
  • i 传统上用来表示“索引” - 不过,即使是给索引起更清晰的名称也是一个好习惯,这样它们就不会在循环超过 2 行。单字母变量名是穿孔卡片时代的可怕遗产,应该被抛弃!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2013-07-23
相关资源
最近更新 更多