根据不同字符的数量对字符串进行排序

时间:2014-10-02 02:04:08

标签: python

我很困惑为什么下面的代码(根据不同字母的数量对字符串进行排序)需要set()list()部分。

strings = ['foo', 'card', 'bar', 'aaaa', 'abab']

strings.sort(key = lambda x: len(set(list(x))))
print(strings)

由于

2 个答案:

答案 0 :(得分:3)

实际上,该代码的关键是set()函数。为什么?因为它将返回一个具有不重复元素的集合。例如:

set('foo') -> ['f', 'o']
set('aaaa') -> ['a']
set('abab') -> ['a', 'b']

然后,为了根据不同字母的数量排序,使用len()函数。

答案 1 :(得分:1)

好问题!让我们从sort()电话中剥离图层。

根据sortsorted上的the Python docs

  

key 指定一个参数的函数,该函数用于从每个列表元素中提取比较键:key = str.lower。默认值为None(直接比较元素)。

也就是说,sort采用关键字参数key并期望它是一个函数。具体来说,它需要一个key(x)函数,用于为strings列表中的每个字符串生成一个键值,而不是通常的词法排序。在Python shell中:

>>> key = lambda x: len(set(list(x)))
>>> ordering = [key(x) for x in strings]
>>> ordering
[2, 3, 1, 2, 2, 4]

这可以是您喜欢的任何订购方案。在这里,我们希望按唯一字母的数量排序。 setlist进入的地方list("foo")将导致['f', 'o', 'o']。然后我们得到len(list('foo')) == 3 - 单词的长度。不是唯一字符的数量。

>>> key2 = lambda x: len(list(x))
>>> ordering2 = [key2(x) for x in strings]
>>> ordering2
[3, 3, 4, 4, 4, 4]

因此,我们使用setlist来获取一组字符。 setlist类似,只是它们只包含list的唯一元素。例如,我们可以为这样的任何单词创建一个字符列表:

>>> list(strings[0])
['f', 'o', 'o']

还有一套:

>>> set(list(strings[0]))
set(['o', 'f'])

len()的{​​{1}}为2,所以当set去比较" foo"在sortstrings[0]中的所有其他strings[x],它使用此列表。例如:

strings

这为我们提供了我们想要的订单。

编辑:@PeterGibson在上面指出>>> (len(set(strings[0][:])) < len(set(strings[1][:]))) True 不是必需的。这是正确的,因为字符串在Python中是可迭代的,就像列表一样:

list(string[i])