簡體   English   中英

如何刪除 Python 列表中的每個第 n 個術語

[英]How to remove every nth term in a Python list

我需要使用 Python 解決問題。 我可以在沒有代碼的情況下解決問題,如果您在互聯網上搜索答案是公開的。 我無法讓我的代碼解決這個問題。 無論如何,這是一個問題:

史蒂夫從左到右按順序重復寫了數字 1、2、3、4 和 5,形成了一個 10,000 個數字的列表,從 123451234512.... , 6th, 9th, ... 數字從左邊開始),然后從結果列表中刪除每第四個數字(即剩余的從左邊開始的第 4、8、12、... 數字),然后刪除每個從那時剩下的第五位數字。 2019 年、2020 年、2021 年的三位數字之和是多少?

我已經寫出 python 代碼以將所有數字打印到列表中。 我需要弄清楚如何刪除每個第 n 個數字。

list = []
value = 1
for i in range (10000):
    list.append (value)
    value = value + 1
    if value == 6:
        value = 1

這是寫出前 10,000 位數字的代碼。

在之前的 class 中,我編寫了一個代碼來刪除每個第 n 個術語並將其打印出來。 該代碼如下所示:

n = 3
def RemoveThirdNumber(int_list):


    pos = n - 1
    index = 0
    len_list = (len(int_list))

    while len_list > 0:

        index = (pos + index) % len_list

        print(int_list.pop(index))
        len_list -= 1

nums = [1, 2, 3, 4]
RemoveThirdNumber(nums)


print(list)

我需要幫助來更改該代碼,以便每隔三個術語刪除一次它會遍歷列表並打印出剩余的數字。

所以這意味着不是 output

3
2
4
1

這將是

[1,2,4]

感謝您嘗試提供幫助!

這是我想出的解決方案。 我不喜歡必須將每個切片變成一個元組,只是為了從迭代器中消費並讓chunk可能等於一些虛假的東西。 也許有人可以檢查一下,讓我知道我是否在某個地方犯了錯誤? 或者只是建議其他可愛的itertools食譜。 顯然,三位數字的總和是10

from itertools import cycle, islice

digits = islice(cycle([1, 2, 3, 4, 5]), 10000)

def skip_nth(iterable, n):
    while chunk := tuple(islice(iterable, n)):
        yield from islice(chunk, n-1)

sum_of_digits = sum(islice(skip_nth(skip_nth(skip_nth(digits, 3), 4), 5), 2019, 2022))
print(sum_of_digits)

Output:

10

編輯 - 根據馬蒂亞斯的建議:

def skip_nth(iterable, n):
    yield from (value for index, value in enumerate(iterable) if (index + 1) % n)
a = [1,2,3,4,5] * (10000//5)
a = [a[i] for i in range(len(a)) if i%3 != 2]
a = [a[i] for i in range(len(a)) if i%4 != 3]
a = [a[i] for i in range(len(a)) if i%5 != 4]

print(a[2019:2022])  # --> [2, 5, 3]
print(sum(a[2019:2022]))  # --> 10

僅使用 100 個進行測試。

bigList = []
value = 1
for i in range (100):
    biglist.append(value)
    value += 1
    if value == 6:
        value = 1
# if you print here you get [1,2,3,4,5,1,2,3...]
x = 3 
del biglist[x-1::x] #where x is the number of "steps" - in your case 3 
# if you print here - biglist ==> 1,2,4,5,2,3 etc.. 

一個實施可能就是這里。

def RemoveThirdNumber(int_list,every):
    rList=[]
    i=0
    for element in int_list:
        i+=1
        if i%every!=0:
            rList.append(element)
    return rList
    
nums = range(1,101)

print(RemoveThirdNumber(nums,3))

我希望我能理解你的問題。 如果我這樣做了,而不是寫所有這些,如果你要刪除每三個項目,為什么不寫更少的代碼。 並且,避免使用保留字......而不是使用 'list' 作為變量名,使用類似 'lst' 或其他的東西

lst = []
val = 1
for i in range(10000):
    lst.append(val)
    val = val + 1
    if val == 6:
        val = 1

def remove_third_item(your_list):
  for i in your_list:
      if i%3==0:
          your_list.remove(i)
  return your_list

print(remove_third_item(lst))

首先,盡量不要使用 Python 內置名稱作為“列表”來命名變量。 它可能會導致問題。

嘗試使用過濾方法。

values_list = []
value = 1
for i in range(10000):
    values_list.append(value)
    value = value + 1
    if value == 6:
        value = 1

filtered = filter(lambda x: (values_list.index(x) + 1) % 3 != 0, values_list)

filtered_to_list = [element for element in filtered]

print(filtered_to_list)

過濾器返回生成器,這就是為什么使用列表推導來獲取它的元素。 Lambda 函數檢查它是否是列表的第三個元素( + 1 到它的索引,因為索引從 0 和 0 % 0 == 0 開始,所以它也會刪除第一個元素)

我也是新手,希望對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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