我正在尝试解决hackerrank challenge:
样本输入
S = "qA2"
在第一行中,如果S有任何字母数字字符,则打印
True
。否则,请打印False
。
在第二行中,如果S具有任何字母字符,则打印True
。否则,请打印False
。
在第三行中,如果S有任何数字,则打印True
。否则,请打印False
。
在第四行中,如果S具有任何小写字符,则打印True
。否则,请打印False
。
在第五行中,如果S具有任何大写字符,则打印True
。否则,打印False
。
我知道可以使用更简单的方法,但是我想使用eval()
。
与其使用所有方法,不如使用多行代码,我想使用其中包含方法的列表(此处为cmd),然后使用for循环遍历它,而eval()
应该将其转换为方法({{ 1}})。如果eval(i+"."+j)
中的任何字符i
返回True,则输出true。
代码/尝试:
list(s)
跟踪/错误:
if __name__ == '__main__':
s = input()
cmd=["isalnum()","isalpha()"]
for j in cmd:
print (any([eval(i+"."+j) for i in list(s)]))
答案 0 :(得分:4)
这是有问题的,因为当您在eval()
语句中串联字符串时,会得到类似于q.isalnum()
的内容。当您真的想在字符'q'.isalnum()
上调用方法时,第一个方法是像变量一样使用q
。像这样:
'q'
除了使用字符串作为命令外,您还可以使用函数本身:
if __name__ == '__main__':
s = input()
cmd=["isalnum()","isalpha()"]
for j in cmd:
print (any([eval("'{}'.{}".format(i, j)) for i in list(s)]))
然后您就不需要使用eval了,
cmd=[str.isalnum, str.isalpha]
为了完整起见,您还可以删除if __name__ == '__main__':
s = input()
cmd=[str.isalnum,str.isalpha]
for j in cmd:
print (any([j(i) for i in list(s)]))
内的括号以创建生成器,而不是列表理解。这很好,因为一旦生成器首先达到第一个any()
结果,生成器将停止,而列表理解将评估整个字符串。您也不需要将True
转换为列表,因为字符串本身是可迭代的。然后剩下的就是:
s