基于数字

时间:2017-08-28 03:21:52

标签: python list numpy

我有一个整数列表,我想删除所有包含7,8,9或0的整数。

这是我到目前为止所做的:

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等。

3 个答案:

答案 0 :(得分: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))]

答案 1 :(得分: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中迭代时修改列表的警告是在目标上

你可以在“迭代”的同时修改列表。在一般意义上,如果你跟踪修改索引的方式,你如何测试完成

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

答案 2 :(得分:0)

首先在迭代列表之前更改代码到list = range(10 ** n-1,7 * 10 ** n-1) range返回一个列表,没有必要迭代列表只是为了复制它。 其次,在第二个循环中,k迭代列表中每个字符串的字符。 对于列表中的我:  对于[&#39; 7&#39;,&#39; 8&#39;,&#39; 9&#39;,&#39; 0&#39;,]中的k:    如果k在我:     list.remove(ⅰ)