【问题标题】:replace specific patterned indexed items in python list替换python列表中的特定模式索引项
【发布时间】:2018-09-18 05:47:59
【问题描述】:

我想替换列表中的每 2 个备选项目。下面的例子:

a = [1, 2, 3, 9, 4, 1, 2, 2, 3, 3, 4, 2, 5, 2, 3]

结果应该是:

[1, ' ' , ' ', 9,  ' ',  ' ', 2,  ' ', ' ', 3, ' ', ' ', 5, ' ', 3]

不应替换最后一项和第一项

我有 for 循环蛮力枚举方法来做到这一点。我很好奇是否有任何简单的替代方法可以做到这一点。

【问题讨论】:

  • 最后那 3 个呢。似乎不合适
  • 不应替换最后一项和第一项。我发布了对问题的编辑(对不起)
  • [x if i%3==0 else ' ' for i,x in enumerate(a[:-1])]+[a[-1]]
  • 你的 for 循环有什么问题?
  • 没有错,我正在寻找更多的就地方式或节省空间的方式

标签: python python-2.7 python-2.x


【解决方案1】:

一个简单的for就地更改循环实际上在速度和空间上都是最有效的:

for i in range(1, len(a) - 1):
    if i % 3:
        a[i] = ' '

【讨论】:

  • 我喜欢这样。您可以使用简单循环没有 enumerate 的宝贵见解在更奇特的答案中迷失了。
  • 是的,pythonista-reflex 不通过迭代索引来迭代列表欺骗了我们其他人;但不是你!不错!
【解决方案2】:

这是一个带有列表理解的变体(创建一个新列表):

lst = [a[0]] + \
      [item if n % 3 == 2 else ' ' for n, item in enumerate(a[1:-1])] + \
      [a[-1]]

如果您想就地完成,或者更简洁一些:

a[1:-1] = [item if n % 3 == 2 else ' ' for n, item in enumerate(a[1:-1])]

【讨论】:

    【解决方案3】:

    您可以使用切片分配仅对需要更改的索引进行变异:

    a = [1, 2, 3, 9, 4, 1, 2, 2, 3, 3, 4, 2, 5, 2, 3]
    a[1:-1:3] = ' ' * len(a[1:-1:3])
    a[2:-1:3] = ' ' * len(a[2:-1:3])
    # [1, ' ', ' ', 9, ' ', ' ', 2, ' ', ' ', 3, ' ', ' ', 5, ' ', 3]
    

    或者以更好的空间效率,不创建不必要的切片和字符串:

    a[1:-1:3] = (' ' for _ in range(1, len(a)-1, 3))
    a[2:-1:3] = (' ' for _ in range(2, len(a)-1, 3))
    

    【讨论】:

    • 该死的太好了!没想到...+1!
    • @hiroprotagonist 我不太喜欢它只是为长度创建两个切片。人们可以在那里做一些更好的数学:)
    • 是的,改用len(range(1, len(a)-1,3)
    • 我实际上很困惑接受哪个作为答案:) 你的还是@hiroprotagonist
    • @juanpa.arrivillaga 现在也有同样的想法。使用生成器,因为它不构建辅助字符串。
    猜你喜欢
    • 2011-11-06
    • 2013-05-30
    • 1970-01-01
    • 2017-03-31
    • 2016-04-03
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多