我想弄清楚为什么以下代码不起作用。 代码对我来说似乎是对的,但它总是返回True。
import string
lower_alpha = string.ascii_lowercase
def no_repeat_loweralpha_1 (string):
for i in range(len(string)):
if not string[i] in lower_alpha: return False
if string[i] in string[:i]: return False
else: return True
string = 'ab/!34cda56aaa1..,efgahijk'
print no_repeat_loweralpha_1(string)
# OUTPUT: True
以下是具有相同问题的代码的另一种变体:
def no_repeat_loweralpha_2(string):
for i in range(len(string)):
if string[i] < 'a' or string[i] > 'z' : return False
if string[i] in string[:i]: return False
else: return True
string = 'ab/!34cda56aaa1..,efgahijk'
print no_repeat_loweralpha_2 (string)
# OUTPUT: True
修改
是否有更短的方法来编写实现此功能的函数?如何使用lambda编写函数?
答案 0 :(得分:1)
更加pythonic的版本应该是这样的:
return s.isalpha() and s.islower() and len(s) == len(set(s))
答案 1 :(得分:0)
这是另一种方法。收集所有独特的小写字母,并根据原始字母检查长度:
def no_repeat_lower_alpha(foo):
s = set()
for i in foo:
if i.islower():
s.add(i)
return len(s) == len(foo)
答案 2 :(得分:0)
尝试以下代码
def lower_and_duplicate(str_test):
dict_found_chars = {}
for char in str_test:
if not char.islower():
return False
if dict_found_chars.has_key(char):
return False
else:
dict_found_chars[char] = 1
return True
print lower_and_duplicate("aAsdfsdfsdf")
print lower_and_duplicate("aasdfsdfsdf")
print lower_and_duplicate("abcdefgh")
dict检查重复项,我们在每一步测试小写
答案 3 :(得分:-1)
更短的版本:
all(x in lower_alpha and s.count(x) < 2 for x in s)
如果任何字符不是小写字母或计数是> 1它将返回False
您可以使用以下命令删除字符串导入:
all( x.isalpha() and x.islower() and s.count(x) < 2 for x in s)