Python 快速且类似蟒蛇的方法来确定一个字谜是否是回文?

Python 快速且类似蟒蛇的方法来确定一个字谜是否是回文?,python,Python,给定一个字符串,我们如何检查它的任何字谜是否可以是回文 例如,让我们考虑字符串“AAC”。它的一个字谜是“ACA”,它是一个回文。如果我们可以从给定字符串的任何字谜中形成回文,我们必须编写一个接受字符串并输出true的方法。否则输出为false 这是我当前的解决方案: from collections import defaultdict def check(s): newdict = defaultdict(int) for e in s: newdict[e

给定一个字符串,我们如何检查它的任何字谜是否可以是回文

例如,让我们考虑字符串“AAC”。它的一个字谜是“ACA”,它是一个回文。如果我们可以从给定字符串的任何字谜中形成回文,我们必须编写一个接受字符串并输出true的方法。否则输出为false

这是我当前的解决方案:

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
表单执行的求和较少,因此我更喜欢它:不需要做超出必要的工作。:)