[英]Delete N items at every Nth multiple in list?
我一直在編寫一些代碼,其中涉及將隨機字符插入到列表中,然后刪除這些字符。 假設您有一個字符串:
['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
以此作為輸入,您可以將其作為輸出:
['x', 'x', 'a', 'r', 'x', 'x', 't', 'q', 'x', 'x' 'j', 'z', 'x', 'x']
我已編寫此代碼。 我嘗試過刪除隨機字符:
iterations = 0
removal = 0
for s in my_list:
if iterations % 3 == 0:
removal = 0
for letters in range(2):
del my_list[removal + iterations]
removal += 1
iterations += 1
這只是刪除了其中的一些,我無法真正弄清楚模式。 這樣做的想法是,每八次迭代就可以從列表中取出五個字符。 或每隔任意多次迭代的任意數量的字符。
如果您可以按順序模式插入字符,則您必須能夠刪除相同順序的那些字符。
好吧,假設兩次插入字符並且插入位置為3。那么您需要首先刪除每第4個元素
>>>for i in range(3, len(my_list), 3):
my_list.pop(i) # I have a problem with my python, so I could only use pop() to remove
['x', 'x', 'a', 'x', 'x', 't', 'x', 'x' 'j', 'x', 'x']
然后,您需要刪除每三個元素
>>>for i in range(2, len(my_list), 2):
my_list.pop(i)
['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
正如一位評論者所指出的那樣,要開始根據索引從列表中隨機刪除項目並不容易。 我要解決的問題是將一些隨機值存儲在要刪除的索引中,然后通過檢查該值是否將其過濾到新數組中。
iterations = 0
removal = 0
placeholder = "TO_DELETE"
for s in my_list:
if iterations % 3 == 0:
removal = 0
for letters in range(2):
my_list[removal + iterations] = placeholder
removal += 1
iterations += 1
my_list = [i for i in my_list if i != placeholder]
您在代碼中遇到的問題是在迭代列表時修改列表的問題。
這是使用itertools
cycle
的另一種方法:
from itertools import cycle
def stride(iterable, take, leave):
pattern = cycle([True] * take + [False] * leave)
for value, take in zip(iterable, pattern):
if take:
yield value
這樣,如果x = ['x', 'x', 'a', 'r', 'x', 'x', 't', 'q', 'x', 'x', 'j', 'z', 'x', 'x']
,然后:
>>> list(stride(x, 2, 2))
['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
如果take
/ leave
大,那么這會通過制作一個大小為take + leave
的pattern
列表來浪費內存。 因此,我們可以制作一個生成器助手函數:
def take_or_leave(take, leave):
while True:
for _ in range(take):
yield True
for _ in range(leave):
yield False
def stride(iterable, take, leave):
pattern = take_or_leave(take, leave)
for value, take in zip(iterable, pattern):
if take:
yield value
我喜歡使用不穩定的單線函數處理這類問題。 這是我所擁有的:
removeStuff = lambda myArray, delEvery: [myArray[x] for x in range(len(myArray)) if x%delEvery!=0]
用法:
>>> removeStuff([1,2,3,4,5,6,7], 3)
[2, 3, 5, 6]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.