【问题标题】:How do I edit a string within a list of lists? [closed]如何编辑列表列表中的字符串? [关闭]
【发布时间】:2017-02-10 16:53:27
【问题描述】:

我有一个列表列表,每个列表都有 11 个字符串。最后一个字符串是一个 8 位代码,我需要保留前三位但删除后五位。

我很确定这可以使用索引和切片来完成。一个使用 5 个条目而不是 11 个条目的列表的示例。

示例 =

[['a','b','c','d','2020BG1C'],['e','f','g','h','1997AF33'],['i','j','k','l', '1566IL2L']]

Desired_Outcome =

[['a','b','c','d','202'],['e','f','g','h','199'],['i','j','k','l', '156']]

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • 另外,你说你想“保留前三位但删除后五位”,但你的例子显示前 四个 字符被保留,最后一个 四个已删除。
  • 我很感激,但我写的所有东西看起来都是垃圾,不值得分享。以后会补充的,谢谢!

标签: python string list indexing replace


【解决方案1】:

您可以使用nested list comprehension 来实现这一点

>>> l = [['a','b','c','d','2020BG1C'],['e','f','g','h','1997AF33'],['i','j','k','l', '1566IL2L']]
>>> [j[:-1]+[j[-1][:4]] for j in l]
[['a', 'b', 'c', 'd', '2020'], ['e', 'f', 'g', 'h', '1997'], ['i', 'j', 'k', 'l', '1566']]

这里的想法是您只获取最后一个元素中的前 4 个字符。

这里j[:-1] 首先获取列表中除最后一个之外的所有元素。 j[-1] 是最后一个元素,j[-1][:4]] 将抓取最后一个元素的前 4 个字符。

有关它们的更多详细信息,请参阅 What does "list comprehension" mean? How does it work and how can I use it?Explain Python's slice notation

【讨论】:

    【解决方案2】:

    使用列表理解。

    example = [['a','b','c','d','2020BG1C'],['e','f','g','h','1997AF33'],['i','j','k','l', '1566IL2L']]
    desired_outcome = [sublist[:-1] + [sublist[-1][:4]] for sublist in example]
    

    据您所知,字符串是 不可变 类型。它不能被编辑。每次你用它做某事时,你都在创建一个new字符串。

    【讨论】:

      【解决方案3】:

      您可以使用 for 循环和切片对其进行编辑

      >>> l = [['a','b','c','d','2020BG1C'],['e','f','g','h','1997AF33'],['i','j','k','l', '1566IL2L']]
      >>> for sublist in l:
      ...     sublist[4] = sublist[4][:4]
      ... 
      >>> l
      [['a', 'b', 'c', 'd', '2020'], ['e', 'f', 'g', 'h', '1997'], ['i', 'j', 'k', 'l', '1566']]
      >>> 
      

      注意:在您的 5 元素示例中,最后一个元素可以索引为 sublist[4]sublist[-1](最后一个元素,倒数)。两者都有效....但最好在整个程序中保持一致。

      【讨论】:

      • 他说列表中有 11 个字符串,但问题中只有 5 个,但它是我们需要的最后一个,因为我们不确定我认为使用 sublist[-1] 而不是 @ 的索引987654325@ 是最好的答案。
      • @Abhishek - 是的,这可能是解决问题的好方法。在定义明确的数据集中,真正的索引和 -1 都同样有效,所以我想我会保留我的示例并注明您的评论。
      • @BhargavRao 我仍然忠于榜样!
      • 这个问题以一种非常令人困惑的方式提出,所以没关系,代码工作正常。
      【解决方案4】:

      或者,您也可以使用map() 实现相同的目的:

      >>> example = [['a','b','c','d','2020BG1C'],['e','f','g','h','1997AF33'],['i','j','k','l', '1566IL2L']]
      >>> map(lambda x: x[:3]+[x[4][:-4]], example)
      [['a', 'b', 'c', '2020'], ['e', 'f', 'g', '1997'], ['i', 'j', 'k', '1566']]
      

      上述解决方案适用于 Python 2.7。如果您使用的是 Python 3.x,则需要将 list() 调用显式添加到 map 为:

      list(map(lambda x: x[:3]+[x[4][:-4]], example))
      

      查看Lambda, filter, reduce and map 上的博客,了解lambda 的功能和map() 在Python 中的工作原理。

      【讨论】:

      • 稍作修改,觉得没必要回滚。谢谢
      • @BhargavRao:很好,实际上更具体到我想说的:)
      【解决方案5】:

      你不能编辑字符串;它们是不可变的

      但是你可以从每个子列表的最后一项中切掉不需要的部分(这会创建一个新的字符串):

      lst = [['a','b','c','d','2020BG1C'],['e','f','g','h','1997AF33'],['i','j','k','l', '1566IL2L']]
      for sublist in lst:
           sublist[-1] = sublist[-1][:4]
      
      print(lst)
      # [['a', 'b', 'c', 'd', '2020'], ['e', 'f', 'g', 'h', '1997'], ['i', 'j', 'k', 'l', '1566']]
      

      一些参考:

      1. Explain Python's slice notation
      2. Aren't Python strings immutable?

      【讨论】:

        【解决方案6】:

        其实很简单, (1) 遍历外部数组。 (2) 获取每个子数组的最后一个元素。 (3) 使用 x[:-5] 对其进行切片

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-18
          • 1970-01-01
          • 2019-08-17
          • 1970-01-01
          • 2020-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多