Sel*_*hon 1 python list-comprehension list
我想尝试所有数字b/1 1和1000包含7.
尝试:
lst=[y for y in range(1,1000) if 7 in y]
print (lst)
Run Code Online (Sandbox Code Playgroud)
得到以下错误:
TypeError: argument of type 'int' is not iterable
Run Code Online (Sandbox Code Playgroud)
尝试:
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)
Run Code Online (Sandbox Code Playgroud)
这给了
if any('3') in i:
TypeError: 'in <string>' requires string as left operand, not bool
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)
有没有想过用列表理解来完成这个?
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)]
Run Code Online (Sandbox Code Playgroud)
为了您的信息,您还可以使用感兴趣的a lambda和filterout值.
list(filter(lambda x: '7' in str(x), range(1, 1000)))
Run Code Online (Sandbox Code Playgroud)
虽然,我不推荐这个,因为filter(特别是a lambda)一般比它的列表理解等效慢.
它可能更具功能性和map str范围:
list(filter(lambda x: '7' in x, map(str, range(1, 1000))))
Run Code Online (Sandbox Code Playgroud)
迭代器版本lambda,最后两个选项中的任何一个但没有应用list,只有在迭代大量项目时才值得.