【问题标题】:Using list comprehension to apply hashtag to items in list where hashtag is not present使用列表推导将主题标签应用于列表中不存在主题标签的项目
【发布时间】:2021-04-23 06:16:35
【问题描述】:

我正在尝试理解和探索如何在列表理解中编写条件:

我想将以下 for 循环转换为列表理解:

    dot = ['.hello', 'world']

    for i in range(len(dot)):
        if dot[i][0] != ".":
            dot[i] = "." + dot[i]

我相信我一定是错误地应用了here 描述的格式:

test = ["." + x for x in dot if dot[x][0] != "."]

...并因此收到以下信息:

TypeError: list indices must be integers or slices, not str

我完全理解可读性受到影响 - 我只是在尝试对自己的学习进行列表理解。

【问题讨论】:

  • 您忘记在列表理解版本中使用range,因此您正在迭代字符串的每个字符,而不是索引。这就是为什么您在尝试使用 str 索引列表时遇到类型错误。
  • 您的for 循环作为列表理解 的等效项将是:["." + dot[i] if dot[i][0] != "." else dot[i] for i in range(len(dot))]。然而,更好的版本已经共享为answer by PacketLoss

标签: python list for-loop if-statement list-comprehension


【解决方案1】:

您无法从列表推导中更新列表 - 推导表达式返回一个新列表。因此,与其考虑dot[some_index],不如考虑列表中的元素x,以及你想用它做什么:

result = ['.' + x if x[0] != '.' else x  for x in dot]

【讨论】:

  • 谢谢。你的解释真的很清楚!
【解决方案2】:
[x if x.startswith('.') else '.' + x for x in dot]

这是在列表理解中执行此操作的正确方法。

您在循环中错误地寻址 dot

test = ["." + x for x in dot if dot[x][0] != "."]

dot 中的x 是列表中的元素,一个字符串。您不能使用strings 访问列表中的索引。

【讨论】:

  • 谢谢! /太短了
猜你喜欢
  • 2013-10-02
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
相关资源
最近更新 更多