Python 定期替换列表中的值

Python 定期替换列表中的值,python,list,replace,Python,List,Replace,假设我在Python中有以下列表: my_list = [10] * 95 给定n,我想在列表中用零替换任何其他m元素,同时保留下一个n元素 例如,如果n=3和m=2,我希望我的列表如下所示: [10, 10, 10, 0, 0, 10, 10, 10 ,0, 0, ..., 10, 10, 10 , 0, 0] 如果不能完全填充,如n=4和m=2的情况,则如果我的列表如下所示,则可以: [10, 10, 10, 10, 0, 0, ..., 10, 10, 10, 10, 0] 我应该如

假设我在Python中有以下列表:

my_list = [10] * 95
给定
n
,我想在列表中用零替换任何其他
m
元素,同时保留下一个
n
元素

例如,如果
n=3
m=2
,我希望我的列表如下所示:

[10, 10, 10, 0, 0, 10, 10, 10 ,0, 0, ..., 10, 10, 10 , 0, 0]
如果不能完全填充,如
n=4
m=2
的情况,则如果我的列表如下所示,则可以:

[10, 10, 10, 10, 0, 0, ..., 10, 10, 10, 10, 0]
我应该如何解决这个问题

[j for i in [[input_num] * n + [0] * m for x in range(int(num / (m + n)) + 1)][:num] for j in i]
也许吧

结果 这对我很有用:

list = [10] * 95

n = 4
m = 2

amask = np.tile(np.concatenate((np.ones(n),np.zeros(m))),int((len(list)+1)/(n+m)))[:len(list)]

list = np.asarray(list)*amask
哪些产出:

array([10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10.,
       10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10.,
       10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10.,
       10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,
        0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,
        0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0.,
       10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10.,
       10., 10., 10.,  0.])
代码采用
n
m
并使用
np.tile
函数构造一个长度与初始
列表匹配的1和0掩码。之后,您只需将掩码乘以列表,并在希望的位置获得零。它还可以灵活地选择不同长度的列表,并且可以(几乎)任意选择
n
m

如果需要,可以将数组强制转换回列表。

这个怎么样

my_list = [10] * 95
n = 3
m = 2

for i in range(n, len(my_list)-1, n+m):
    my_list[i:i+m] = [0]*m

print(my_list)

编辑

我发现上面的代码在某些情况下更改了结果列表的长度

>>> a = [1,2,3]
>>> a[2:4] = [0] * 2
>>> a
[1, 2, 0, 0]
因此,长度应该以某种方式恢复

my_list = [10] * 95
cp_list = list(my_list)
n = 3
m = 5

for i in range(n, len(my_list)-1, n+m):
    cp_list[i:i+m] = [0]*m

cp_list = cp_list[:len(my_list)]
print(cp_list)
这只需要
m
分配来完成工作(而且
m
可能很小)

如果你真的只有两个可能的值(例如10和0),你可以做得更简单:

my_list = [ 10 if i % (n+m) < n else 0 for i in range(95) ]
但是它在内部构建了很多列表,因此需要通过测试来确定这在您的情况下是否有效。(对于大型列表,还应考虑内存消耗。)

如果您可以使用
numpy
(这个问题有点离题,但因为它很普遍):

my_list=(np.arange(95)%(n+m)
您可以使用创建一个无休止的
[10,10,10,0,0]
序列,然后使用以下元素获取该序列的前95个元素:


numpy
也可以非常简洁地做到这一点

a = np.array(my_list).reshape(-1, n + m)
a[:, n:] = 0
result = a.ravel().tolist()

还有一种可能性,这次是:

如果列表包含字符串,则会将其替换为空字符串,而不是
0

>>> my_list = 'abcdefghijk'
>>> [x * (i % (n+m) < n) for i, x in enumerate(my_list)]
['a', 'b', 'c', 'd', '', '', 'g', 'h', 'i', 'j', '']
>>我的列表='abcdefghijk'
>>>[x*(i%(n+m)
同样在itertools系列中,您可以选择所需的模式:

给定的

import itertools as it


m, n = 2, 3
p = n + 1    
代码

pattern = it.repeat([10] * n + [0] * m)
res = list(it.islice(it.chain.from_iterable(pattern), None, 95))
print(res)
# [10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 0, 0, ... 10, 10, 10, 10, 0, 0]

试验



然而,@Aran Fey的解决方案更干净,因为它不需要链接。

输入列表是否总是用一个相同的值填充(如您的示例中的10)?换句话说,您想创建一个新的列表,如
[10,10,10,0,0,…]
,还是想覆盖现有列表中的每N个值?这个问题怎么不值得结束?OP基本上是在没有任何明显的尝试的情况下寻求答案something@Denny一开始,我对这个网站上的这个系统也很困惑。好问题的3个标准:1)(可见)努力。2) 有用且清晰。更重要的是,最后两个标准在大多数用户的优先级列表中得分更高。如果你浏览这个和其他stack exchange网站,你会发现无数问题的例子,这些问题没有显示出明显的效果,但对其他用户来说很有用(也许更重要)。我个人认为这个问题非常具体,而且不太可能有人会在谷歌搜索中发现这个问题(当然,事先不知道这个问题);此外,它非常基本。它很简单->它得到了很多答案->热度公式(对公式没有评论)认为它很热->它显示在HNQ列表上->它吸引了更多的观众,大多数不是来自美国。此外,仅仅通过阅读标题是不可能理解这个问题的(因为它是特定的!),因此观众被迫点击链接,从而生成视图。
numpy
?是真的吗?@Alfe:numpy有什么问题?它的应用非常广泛,而且是专门为列表/数组设计的。@EricDuminil只是在工作上做得太过火了,仅此而已。这就像要求一个
print()
并得到一个
f=open('/dev/stdout','w');f、 写(“foo”);f、 冲洗();f、 关闭()
。工作,是的。但是增加了不必要的复杂性。顺便说一句,在
numpy
,我会像
(np.arange(95)%5<3)*10
@Alfe确实,你接受的版本要优雅得多->+1。不过,我的建议也能完成工作,有时这就是你所需要的。谢谢你指出它。@Julien不,OP说“它可以是任何数字,但它永远是同一个”,所以它会充满任何相同的数字。哎呀。的确如此。很好的方法。但只有当
len(我的列表)
小于
m
时,这才比我的解决方案更有效。对此答案有否决票,但没有批评意见。Downvoter,请评论您不喜欢的内容。要删除列表的最后一个元素,请最好使用
del cp_list[n://code>。如果可以使用列表表达式,为什么要使用itertools?@MoonsikPark不确定您的意思。如果你指的是你自己的解决方案:因为我认为我的解决方案比你的更具可读性。你能把你的3个不同的解决方案作为3个单独的答案发布吗?我想投第二票,但其他人。。。“没那么多,”阿兰菲说,“我想那太过分了。”。在这种情况下,请不要随意投票,即使投票只是表明答案提供了任何帮助(不是完美的)。并认为第二个可能是最慢的四个(只与大量的课程有关),它似乎与<代码> n=4 < /> >和<代码> m=2 < /代码>无关。它会引发
ValueError:无法将大小为95的数组重塑为形状(6)
@EricDuminil如果原始列表的长度不是要重复的子序列长度的倍数,是否应该引发错误?请查看第二个h
n = 3
m = 2

pattern = [10] * n + [0] * m
my_list = list(itertools.islice(itertools.cycle(pattern), 95))
a = np.array(my_list).reshape(-1, n + m)
a[:, n:] = 0
result = a.ravel().tolist()
[x * (i % (n + m) < n) for i, x in enumerate(my_list)]
>>> n = 4
>>> m = 2
>>> my_list = range(20)
>>> [x * (i % (n+m) < n) for i, x in enumerate(my_list)]
[0, 1, 2, 3, 0, 0, 6, 7, 8, 9, 0, 0, 12, 13, 14, 15, 0, 0, 18, 19]
>>> my_list = 'abcdefghijk'
>>> [x * (i % (n+m) < n) for i, x in enumerate(my_list)]
['a', 'b', 'c', 'd', '', '', 'g', 'h', 'i', 'j', '']
import itertools as it


m, n = 2, 3
p = n + 1    
pattern = it.repeat([10] * n + [0] * m)
res = list(it.islice(it.chain.from_iterable(pattern), None, 95))
print(res)
# [10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 0, 0, ... 10, 10, 10, 10, 0, 0]
pattern = it.repeat([10] * p + [0] * m)
res = list(it.islice(it.chain.from_iterable(pattern), None, 95))
print(res)
# [10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 0, 0, ... 10, 10, 10, 10, 0]
assert len(res) == 95