【问题标题】:How to use += (Add AND) with List Comprehension如何在列表理解中使用 +=(添加 AND)
【发布时间】:2018-06-15 14:32:25
【问题描述】:

我正在尝试弄清楚如何将下面的代码与列表理解一起使用。

link = 'page={}&index={}'
index = 10
links = []
for page in range(2, 4):
    links.append(link.format(page, index))
    index += 10

我尝试了许多不同的方法并尽可能多地在 Google 上搜索(也许我没有在搜索正确的术语?)。我仍然无法弄清楚。以下是我尝试过的一种方法,但出现SyntaxError 错误。

link = 'page={}&index={}'
index = 10
links = [link.format(link, index) for page in range(2, 4) index += 10]

这应该是列表推导的输出:

['page=2&index=10', 'page=3&index=20']

如果有人有任何想法,将不胜感激。谢谢!

【问题讨论】:

  • 广义地说,列表推导式只能包含表达式。 index += 10 不是表达式;这是一个声明。所以你不能把它放在列表理解中。但即使你能做到这一点,你也应该质疑你是否应该这样做。并非所有代码都可以通过缩短代码来改进。
  • @dfundako 我编辑了问题以显示我的预期输出。谢谢。
  • @Kevin 哦,好吧,那也很好,如果我不能做到这一点,那就不是世界末日。我只是找不到任何谈论这样做的地方,等等......谢谢你提供的信息。
  • @Kevin 学习编码时要记住的好东西。代码只写一次,读一百次。使其更易于阅读和理解,而不是节省一两行代码。

标签: python python-3.x


【解决方案1】:

您可以使用enumerate: 内置函数来增加index:

>>> [link.format(page, i*10) for i, page in enumerate(range(2, 4), start=1)]
['page=2&index=10', 'page=3&index=20']

这也适用于任何其他可迭代对象,而不仅仅是 range(2, 4),例如字符串列表。因此,任何此类可迭代对象都可以使用计数器变量进行扩充,例如您的示例中的 index

【讨论】:

  • enumerate 在这里太过分了,因为i == page - 1
  • @chepner 嗯,是的,但它更普遍适用。除了range(2, 4),你可以有一个带有步骤的范围,或者只是任何可迭代的。
【解决方案2】:

您不能在列表推导中使用 += 语句(或任何与此相关的语句)。在您的情况下,请使用 zipitertools.count

import itertools
[link.format(page, index) for page, index in zip(range(2, 4), itertools.count(10, 10))]

【讨论】:

  • 是的 chepner 说的(几乎)[link.format(page, 10*(page-1)) for page in range(2, 4)]
  • (当我注意到页面和链接之间的关系不太正确时,我删除了我的评论;不过,克里斯明白了。)
  • 我不确定您是否想将您的评论变成答案,以便我可以正确标记@Chris_Rands,但这正是我想要弄清楚的。感谢您做出如此简单直接的回答。
  • @antfuentes87 我的意思是,他们都做同样的事情......但我猜这是你的电话。不过我同意@tobias_k,enumerate/itertools.count 更通用。
  • 我同意,但我必须导入 itertools 以供您使用,而我不必使用 @Chris_Rands。另外,当我试图自己弄清楚时,我也有过非常相似的尝试。
猜你喜欢
  • 2015-05-24
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多