2017-08-28 71 views
1

我有一個整數列表,我想刪除其中有7,8,9或0的所有整數。從基於數字的python列表中刪除元素

這是我迄今所做的:

import numpy as np 
def P(n): 
    list = [] 
    for i in range(10**(n-1),7*10**(n-1)): 
     list.append(i) 
    for i in list: 
     for k in str(i): 
      if k in ['7','8','9','0']: list.remove(i) 
      #elif k == '8': list.remove(i) 
      #elif k == '9': list.remove(i) 
      #elif k == '10': list.remove(i) 
    return list 

但它返回:

[11, 12, 13, 14, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26, 28, 30, 31, 32, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 46, 48, 50, 51, 52, 53, 54, 55, 56, 58, 60, 61, 62, 63, 64, 65, 66, 68] 

我怎樣才能解決這個代碼,以便它擺脫了不必要的價值觀呢?即18,20,28,30等。

+0

是否修改了您正在迭代的列表 - 隨之而來的瘋狂。也不要命名一個變量'list'它隱藏pythons builtin類型。如果全部(c在str(i)中的c'不在'7890'中)''返回[我爲我在範圍內(10 **(n-1),7 * 10 **(n-1) – AChampion

回答

3

你可以使用列表理解和內置any()方法重新創建列表,以檢查是否有任何數字在不需要的列表中。爲了遍歷你需要輸入的數字,先將它們投射到str()。例如:

def P(n): 
    l = [] 
    for i in range(10**(n-1),7*10**(n-1)): 
     l.append(i) 
    l = [x for x in l if not any(y in ['7', '8', '9', '0'] for y in str(x))] 

輸出:

[11, 12, 13, 14, 15, 16, 21, 22, 23, 24, 25, 26, 31, 32, 33, 34, 35, 36, 41, 42, 43, 44, 45, 46, 51, 52, 53, 54, 55, 56, 61, 62, 63, 64, 65, 66] 

您還可以避免通過創建初始列表和for循環:

def P(n): 
    l = range(10**(n-1),7*10**(n-1)) 
    l = [x for x in l if not any(y in ['7', '8', '9', '0'] for y in str(x))] 
0

首先遍歷列表之前改變代碼到列表=範圍(10 ** n-1,7 * 10 ** n-1) 範圍返回一個列表,不需要迭代列表以複製它。 其次,在第二個循環中,k遍歷列表中每個字符串的字符。 對於i在列表: 對於k在[ '7', '8', '9', '0',]: 如果k在I: list.remove(ⅰ)

1

另一個過濾器測試選項是使用set路口

n=2 
print([i for i in range(10**(n-1),7*10**(n-1)) 
     if not {'7','8','9','0'} & set(str(i)) 
     ]) 
[11, 12, 13, 14, 15, 16, 21, 22, 23, 24, 25, 26, 31, 32, 33, 34, 35, 36, 41, 42, 43, 44, 45, 46, 51, 52, 53, 54, 55, 56, 61, 62, 63, 64, 65, 66] 

,並同時對修改在Python for迭代它時,列表中的警告是對目標

你可以從字面上修改,而在一般意義上,如果「迭代」列表你跟蹤你如何修改索引,如何測試完成on

n =2 
lst = list(range(10**(n-1),7*10**(n-1))) 
i = 0 
while i < len(lst): 
    if {'7','8','9','0'} & set(str(lst[i])): 
     lst.pop(i) 
    else: 
     i += 1 
相關問題