Python 快速且类似蟒蛇的方法来确定一个字谜是否是回文?
给定一个字符串,我们如何检查它的任何字谜是否可以是回文 例如,让我们考虑字符串“AAC”。它的一个字谜是“ACA”,它是一个回文。如果我们可以从给定字符串的任何字谜中形成回文,我们必须编写一个接受字符串并输出true的方法。否则输出为false 这是我当前的解决方案:Python 快速且类似蟒蛇的方法来确定一个字谜是否是回文?,python,Python,给定一个字符串,我们如何检查它的任何字谜是否可以是回文 例如,让我们考虑字符串“AAC”。它的一个字谜是“ACA”,它是一个回文。如果我们可以从给定字符串的任何字谜中形成回文,我们必须编写一个接受字符串并输出true的方法。否则输出为false 这是我当前的解决方案: from collections import defaultdict def check(s): newdict = defaultdict(int) for e in s: newdict[e
from collections import defaultdict
def check(s):
newdict = defaultdict(int)
for e in s:
newdict[e] += 1
times = 0
for e in newdict.values():
if times == 2:
return False
if e == 1:
times += 1
return True
有没有使用python库的更短的解决方案 这是一个使用标准库的较短解决方案,具有正确的算法(除最多一个字符外,所有字符计数必须为偶数):
下面是一个使用标准库的较短的解决方案,该解决方案使用了一个正确的算法(除最多一个字符外,所有字符计数必须为偶数):
这可能更适合于代码高尔夫,但它是相当琐碎的 注意,回文需要一组平衡的边,因此每个类型通常需要偶数个输入。然而,在中间可以提供一个奇数项,因此可以将其基本上提高到一组奇数的字符的最大值。这可以通过一个列表来完成
>>> from collections import Counter
>>> def is_palindrome(letters):
... return len([v for v in Counter(letters).values() if v % 2]) <= 1
...
>>> is_palindrome('level')
True
>>> is_palindrome('levels')
False
>>> is_palindrome('levelss')
True
来自集合导入计数器的>>
>>>def是回文(字母):
... 返回len([v代表计数器中的v(字母)。如果v%2,则返回value())>>为回文('level'))
符合事实的
>>>是回文('levels'))
错误的
>>>是回文('levelss'))
符合事实的
哦,等等,有人提出了一个解决方案,但这就是我得到的。这可能更适合于代码高尔夫,但它非常简单 注意,回文需要一组平衡的边,因此每个类型通常需要偶数个输入。然而,在中间可以提供一个奇数项,因此可以将其基本上提高到一组奇数的字符的最大值。这可以通过一个列表来完成
>>> from collections import Counter
>>> def is_palindrome(letters):
... return len([v for v in Counter(letters).values() if v % 2]) <= 1
...
>>> is_palindrome('level')
True
>>> is_palindrome('levels')
False
>>> is_palindrome('levelss')
True
来自集合导入计数器的>>
>>>def是回文(字母):
... 返回len([v代表计数器中的v(字母)。如果v%2,则返回value())>>为回文('level'))
符合事实的
>>>是回文('levels'))
错误的
>>>是回文('levelss'))
符合事实的
哦,等等,有人用一个解决方案打败了我,但这就是我得到的。不使用计数器:
>>> def isit(s):
... ls = [ x % 2 for x in [s.count(x) for x in set(s)]]
... return [False, True][all(ls) or ls.count(1) == 1]
...
>>> isit('abc')
False
>>> isit('abb')
True
>>> isit('abbd')
False
>>> isit('abbdd')
True
>>> isit('abbdda')
True
>>>
不使用计数器:
>>> def isit(s):
... ls = [ x % 2 for x in [s.count(x) for x in set(s)]]
... return [False, True][all(ls) or ls.count(1) == 1]
...
>>> isit('abc')
False
>>> isit('abb')
True
>>> isit('abbd')
False
>>> isit('abbdd')
True
>>> isit('abbdda')
True
>>>
即使它在算法上不是最好的(如果字符串不是很长,这也不是问题),我还是想提供一个更具可读性的解决方案
from itertools import permutations
def has_palindrome(s):
return any(c == c[::-1] for c in permutations(s,len(s)))
即使它在算法上不是最好的(如果字符串不是很长,这也不是问题),我还是想提供一个更具可读性的解决方案
from itertools import permutations
def has_palindrome(s):
return any(c == c[::-1] for c in permutations(s,len(s)))
正如您所预料的,noYour算法认为“AAABBB”有一个回文字谜。这是不正确的。对于“AADC”,也会返回true,这与您可能预期的不正确,您的算法认为“AAABBB”有一个回文字谜。这是不正确的。对于不正确的“AADC”也返回true是的,相同的想法。只是吹毛求疵:您不需要创建列表来获得有限迭代器的长度:
len()
works。一般来说,这可以节省内存(在这里,这通常可以忽略不计)。是的,我知道,可以只点击(和)两次,但我在解释器中这样做了,并打算在每一步发布单独的结果。对于迭代器,没有这样好的内部内容呈现,看看[1,1]
vs
@EOL生成器表达式没有长度-例如,len(a表示范围内(10)的a,如果a为%2)
是一个类型错误。@lvc你说得对,我的错。我确定了我的答案。与我似乎记得的相比,我自己也有点惊讶。但是,原则上,可以定义迭代器的长度(导致无限迭代器的计算时间无限):sum(1表示uu.in迭代器)
-这比len([…])
的内存效率要高得多。是的,同样的想法。只是吹毛求疵:您不需要创建列表来获得有限迭代器的长度:len()
works。一般来说,这可以节省内存(在这里,这通常可以忽略不计)。是的,我知道,可以只点击(和)两次,但我在解释器中这样做了,并打算在每一步发布单独的结果。对于迭代器,没有这样好的内部内容呈现,看看[1,1]
vs
@EOL生成器表达式没有长度-例如,len(a表示范围内(10)的a,如果a为%2)
是一个类型错误。@lvc你说得对,我的错。我确定了我的答案。与我似乎记得的相比,我自己也有点惊讶。但是,原则上,可以定义迭代器的长度(导致无限迭代器的计算时间无限):sum(1表示uu.in迭代器)
-这比len([…])
的内存效率要高得多。非常感谢您指出我上面的错误并提供此解决方案!您可以执行sum(count%2==1)操作,而不是sum(count%2==1用于count in…)
,甚至可以执行sum(count%2用于count in…)
。这是一个有趣的建议。但是,if
表单执行的求和较少,因此我更喜欢它:不需要做超出必要的工作。:)非常感谢您指出我上面的错误并提供此解决方案!您可以执行sum(count%2==1)操作,而不是sum(count%2==1用于count in…)
,甚至可以执行sum(count%2用于count in…)
。这是一个有趣的建议。但是,if
表单执行的求和较少,因此我更喜欢它:不需要做超出必要的工作。:)