首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免使用Python技巧查找字谜

避免使用Python技巧查找字谜
EN

Code Review用户
提问于 2020-10-02 19:15:26
回答 4查看 1.8K关注 0票数 8

什么是字谜?

字符串的字元是另一个包含相同字符的字符串,只有字符的顺序可以不同。例如,“abcd”和“dabc”是彼此之间的对白。

代码语言:javascript
复制
def anagram_check(string1,string2):
    list1 = [char1.lower() for char1 in string1 if char1 != " "]
    list2 = [char2.lower() for char2 in string2 if char2 != " "]
    if len(list1) != len(list2):
        return False
    else:
        list1.sort()
        list2.sort()
        return list1 == list2

print(anagram_check('clint eastwood','old west action'))

问题

我已经开始学习数据结构和算法,我的问题是:我是使用了太多的Python技巧来解决这个问题,还是需要想出一种更基本的方法来解决这个问题?

EN

回答 4

Code Review用户

回答已采纳

发布于 2020-10-02 20:29:19

为了回答您的具体问题,我只看到代码中使用了一些“技巧”:

  1. 转换为小写。
  2. 消除空间。
  3. 比较长度作为快捷方式
  4. 对列表进行排序以快速比较它们。

这些都不是特别“以Python为中心”。惟一的警告是,Python是O(1)来计算长度,而C字符串是O(n)来计算长度。

(注意:虽然Python的标准sort()比C的标准qsort()更快,但这是库的事情,而不是您的责任。)

一件“明显”的事情是使用collections.Counter生成一个等价类,以确定两个字符串是否为字谜。这肯定是以Python为中心的,因为大多数其他语言都没有直接的对等语言。(尽管用已经具有dict/散列/assoc数组支持的语言编写是很简单的。)

这就是说,让我们从Python的角度来看一下您的代码。

是pep8吗?

佩普-8的角度看,您的函数有几个问题。

  1. 您的函数没有博士。
  2. 用逗号后面的空格。

它是快速型的吗?

您已经做了一个很好的工作,优化了代码,而不是变成“太Pythonic”。不过,我建议以下几点:

  1. 只给.lower()打一次电话。您可以调用char1.lower() for char1 in string1,但是您可以使用char1 for char1 in string1.lower(),它将在每个字符串中调用.lower()一次,而不是每一个字符调用一次。当有人为您传递60000个字符串时,这将变得非常重要。;-)
  2. 相信那条蛇!与其检查长度,不如信任Python这样做!您可以进一步简化代码。

修正了这个名字!

除非您有某种要求,您必须使用名称,更改名称!名称anagram_check听起来像一个过程(做某事),而不是一个函数(返回某物)。但你要返回一个布尔值。因此,让它成为一个听起来很布尔的名字:

代码语言:javascript
复制
is_anagram_of
are_anagrams
has_anagram
compare_equal_when_sorted_with_spaces_removed
票数 8
EN

Code Review用户

发布于 2020-10-02 22:47:55

利用@hjpotter92 92之前提交的工作,并添加一个额外的转折:

代码语言:javascript
复制
def anagram_check(*args ):
    return len( { tuple(sorted(x.lower().replace(' ', ''))) for x in args } ) == 1

这有可能通过避免sorted(x.lower().replace( ...)结构的重复而获得额外的丙酮性分数。相反,构造被应用于集合理解中的两个参数,并且测试结果集是否有一个元素提供了答案。这个实现还泛化了API以涵盖更多的字符串(如果需要的话),如果所有给定的字符串都是对方的字谜,返回True (感谢堆溢出指出这一点)。

如果您真的想要一个仅限于两个字符串的函数,您可能更喜欢:

代码语言:javascript
复制
def anagram_check(string1, string2):
    return len({tuple(sorted(x.lower().replace(' ', ''))) for x in [string1,string2]}) == 1

通过定义一个作用于每个字符串的函数,代码可以变得更简洁和更易读:

代码语言:javascript
复制
def make_unique(x): 
     return tuple( sorted( x.lower().replace(' ', '') ) )

def anagram_check(*args): 
     return len( { make_unique(x) for x in args } ) == 1
票数 10
EN

Code Review用户

发布于 2020-10-02 20:15:18

欢迎来到代码评审。

由于您在这里寻找Python技巧,有很多东西都可以使它变得Python、可维护、更短,等等。取决于您的理解,以及在不久的将来代码的目标受众,您可以选择单独的方法。给你一些提示,让你开始:

  1. 您可以使用filter删除所有空白字符: filter(lambda : char !=‘',string.lower())
  2. 您可以使用replace替换所有空白空间: string.lower().replace(‘,'')
  3. 您可以使用collections.Counter来验证两个字符串中每个字符的计数是否相等,尽管列表相等也是有效的。
  4. 您可以在筛选的字符串上验证(或仅仅返回) sorted调用的相等性。
代码语言:javascript
复制
def anagram_check(string1, string2):
    return sorted(string1.lower().replace(' ', '')) == sorted(string2.lower().replace(' ', ''))

上面的一条线完全是毕多诺的,国际海事组织。

票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/250124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档