2017-08-28 200 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