我有一个整数列表,我想删除所有包含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等。
答案 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(ⅰ)