列表理解以查找包含7的所有1到1000之间的数字

时间:2018-01-24 19:37:42

标签: python list list-comprehension

我正在尝试将包含7的所有数字b / 1 1和1000。

尝试:

lst=[y for y in range(1,1000) if 7 in y]
print (lst)

得到以下错误:

TypeError: argument of type 'int' is not iterable

尝试:

lst=[y for y in range(1,1000)]
newlst=[]
str1=list(map(lambda x:str(x),lst))

for i in str1:
    if any('7') in i:
        newlst.append(i)
print (newlst)

这给出了

if any('3') in i:
TypeError: 'in <string>' requires string as left operand, not bool

Process finished with exit code 1

有任何想法用列表理解来完成这个吗?

2 个答案:

答案 0 :(得分:7)

7 in y无效,因为in适用于容器,而y不是可迭代的。

any(<string>) 无效(在语义上,不是语法上),因为表达式的结果是布尔值(正如您所猜测的那样)。 any对序列执行短路,评估容器中每个元素的真值或它接收的可迭代值。由于所有字符串(除了空字符串)都是Trueany(<non empty string>)评估为True,因此使用any开头并没有多大意义。事实上,如果你刚刚完成了if '7' in i,那就可以了。

要回答原始问题,您可以将y转换为字符串,并检查字符'7'是否存在。

[y for y in range(1, 1000) if '7' in str(y)]

为了您的信息,您还可以使用感兴趣的lambdafilter个值。

list(filter(lambda x: '7' in str(x), range(1, 1000)))

虽然我不建议这样做,因为filter(特别是lambda)一般比其列表推导等效

可能更具功能性且map str在该范围内:

list(filter(lambda x: '7' in x, map(str, range(1, 1000))))

带有lambda的迭代器版本,最后两个选项中的任何一个但没有应用list,只有在迭代大量项目时才值得。

答案 1 :(得分:0)

如果您关注性能,请考虑使用生成器理解,这比列表理解快许多个数量级。

# adapting coldspeed's approach to generator comprehension
(y for y in range(1, 100000) if '7' in str(y))
In [86]: %timeit [y for y in range(1, 100000) if '7' in str(y)]
21.8 ms ± 883 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [87]: %timeit (y for y in range(1, 100000) if '7' in str(y))
555 ns ± 3.72 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)