簡體   English   中英

刪除列表中每N倍的N個項目嗎?

[英]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 + leavepattern列表來浪費內存。 因此,我們可以制作一個生成器助手函數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM