)` 到底是什么意思?)
刷 LeetCode 的时候经常会看到这样一行代码key.join(sorted(s))第一次看到这行代码很多人都会愣一下“这什么东西空字符串、join、sorted怎么还三件套组合技”别急这行代码其实不难。它的作用一句话概括就是把字符串里的字符按顺序排序然后重新拼成一个新的字符串。一、先看一个例子假设有一个字符串seat执行key.join(sorted(s))最后得到keyaet也就是说eat被重新排序成了aet。二、拆开来看这行代码可以拆成两步sorted(s)和.join(...)三、第一步sorted(s)sorted()的作用是排序。如果seat那么sorted(s)结果是[a,e,t]注意这里有一个很关键的点sorted(s)返回的是列表不是字符串。也就是说它不是返回aet而是返回[a,e,t]Python 的意思大概是“我已经帮你排好队了但我先按列表形式给你。”四、第二步.join(...)既然sorted(s)返回的是列表那我们就要把这个列表重新拼成字符串。这时候就要用.join([a,e,t])结果是aet这里的是空字符串表示字符之间不加任何东西直接拼接。比如.join([a,e,t])得到aet如果你写成-.join([a,e,t])得到的就是a-e-t如果你写成 .join([a,e,t])得到的就是a e t所以.join(...)意思就是用空字符串把里面的字符连接起来。五、完整过程还是看这个例子seatkey.join(sorted(s))执行过程是sorted(eat)得到[a,e,t]然后.join([a,e,t])得到aet所以最终keyaet六、它在字母异位词分组里有什么用在“字母异位词分组”这道题里这行代码非常关键。所谓字母异位词就是几个字符串使用的字母完全一样只是顺序不同。比如eatteaate这三个字符串就是字母异位词。它们原本长得不一样eat tea ate但是一排序全都变成aet代码验证一下print(.join(sorted(eat)))print(.join(sorted(tea)))print(.join(sorted(ate)))输出aet aet aet这就说明它们可以用同一个key表示。七、为什么可以用它作为字典的 key字典分组时我们需要一个“统一标识”。比如groups[key].append(s)如果seat那么keyaet于是groups[aet].append(eat)如果stea排序后keyaet于是groups[aet].append(tea)如果sate排序后还是keyaet于是groups[aet].append(ate)最后就会得到{aet:[eat,tea,ate]}这就是字母异位词分组的核心思想。八、再看完整代码importcollectionsfromtypingimportListclassSolution:defgroupAnagrams(self,strs:List[str])-List[List[str]]:groupscollections.defaultdict(list)forsinstrs:key.join(sorted(s))groups[key].append(s)returnlist(groups.values())其中最核心的一句就是key.join(sorted(s))它负责把不同顺序的字母异位词变成同一个标准形式。九、容易误解的地方误解一sorted(s)会直接返回字符串不会。sorted(eat)返回的是[a,e,t]所以才需要.join(...)误解二join是随便用的join只能拼接字符串序列。比如下面这样是可以的.join([a,e,t])但如果列表里是数字.join([1,2,3])会报错。因为数字不能直接被join拼接必须先转成字符串。误解三没意义这里的很重要。它表示用什么东西把字符连接起来。.join([a,e,t])结果是aet-.join([a,e,t])结果是a-e-t所以不是摆设它决定了拼接时中间加什么。十、总结key.join(sorted(s))可以拆成两步理解第一步sorted(s)把字符串里的字符排序得到字符列表。第二步.join(...)把字符列表重新拼成字符串。所以.join(sorted(eat))结果是aet它常用于字母异位词分组因为eat-aettea-aetate-aet不同顺序的单词排序后会变成同一个字符串。一句话记住.join(sorted(s))就是把字符串变成“按字母排序后的标准形态”。