【问题标题】:assigning every Nth element in a list in python在python中分配列表中的每个第N个元素
【发布时间】:2013-04-01 08:10:17
【问题描述】:

我想将列表中的每个第 N 个元素设置为其他内容。

(就像 this question 用于 Matlab。)

这是一个 N=2 的尝试:

>>> x=['#%d' % i for i in range(10)]
>>> x
['#0', '#1', '#2', '#3', '#4', '#5', '#6', '#7', '#8', '#9']
>>> x[0::2] = 'Hey!'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 4 to extended slice of size 5

我该如何解决这个问题?切片似乎期望一个可迭代的,而不仅仅是一个值。

【问题讨论】:

  • 这不是一个数组,它是一个列表。这很重要,因为标准库中有一个数组类型,公共库numpy 中有一个不同的数组类型,并且使用numpy arrayx[::2] = 'Hey!' 实际上会起作用..
  • 谢谢,我已经更正了。

标签: python list


【解决方案1】:

切片分配的右侧必须是适当长度的序列; Python 将'Hey!' 视为字符序列'H', 'e', 'y', '!'

你可以很聪明,创建一个适当长度的序列:

x[::2] = ['Hey!'] * len(x[::2])

但是,最清晰的方法是使用for 循环:

for i in range(0, len(x), 2):
    x[i] = 'Hey!'

【讨论】:

  • @JasonS 有一个单行(添加在上面),但它的可读性明显降低。
  • 我个人认为第一个解决方案非常Pythonic。
【解决方案2】:

列表推导也可以:

x=['#%d' % i for i in range(10)]
['Hey!' if i%3 == 0 else b for  i,b in enumerate(x)]

这显然是 n=3。

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2022-01-25
    相关资源
    最近更新 更多