我正在尝试将包含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
有任何想法用列表理解来完成这个吗?
答案 0 :(得分:7)
7 in y
无效,因为in
适用于容器,而y
不是可迭代的。
any(<string>)
也无效(在语义上,不是语法上),因为表达式的结果是布尔值(正如您所猜测的那样)。 any
对序列执行短路,评估容器中每个元素的真值或它接收的可迭代值。由于所有字符串(除了空字符串)都是True
,any(<non empty string>)
评估为True
,因此使用any
开头并没有多大意义。事实上,如果你刚刚完成了if '7' in i
,那就可以了。
要回答原始问题,您可以将y
转换为字符串,并检查字符'7'
是否存在。
[y for y in range(1, 1000) if '7' in str(y)]
为了您的信息,您还可以使用感兴趣的lambda
和filter
个值。
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)