我很困惑,为什么下面的代码需要set()
和list()
部分,它们正在寻找基于字母数量的不同字母来排序字符串。根据不同字符的数量对字符串进行排序
strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
strings.sort(key = lambda x: len(set(list(x))))
print(strings)
感谢
我很困惑,为什么下面的代码需要set()
和list()
部分,它们正在寻找基于字母数量的不同字母来排序字符串。根据不同字符的数量对字符串进行排序
strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
strings.sort(key = lambda x: len(set(list(x))))
print(strings)
感谢
事实上,该代码的关键是set()
功能。为什么?因为它会返回一个没有重复元素的集合。例如:
set('foo') -> ['f', 'o']
set('aaaa') -> ['a']
set('abab') -> ['a', 'b']
然后,为了基于不同字母的数目排序,则使用len()
功能。
是的,但它在我的测试中似乎没有'list(...)'调用。我想不出它需要它的原因。 – 2014-10-02 02:11:39
你说得对,@PeterGibson。它不需要它,因为字符串是可迭代的,就像列表一样。 – Joseph8th 2014-10-02 03:24:19
不错的问题!让我们剥离sort()
呼叫的层。
根据the Python docs上sort
和sorted
,
键指定用于提取从每个列表元素的比较关键一个参数的函数:键= 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]
这可以是任何你喜欢的排序方案。在这里,我们要按号码的顺序排列。这是set
和list
进来的地方。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]
因此我们使用set
和list
得到一组字符。 A set
就像是list
,除了它们只包含list
的唯一元素。例如,我们可以使角色的列表任何像这样的字:
>>> list(strings[0])
['f', 'o', 'o']
而且一组:
>>> set(list(strings[0]))
set(['o', 'f'])
的是set
的len()
是2,所以当sort
去比较“富“在strings[0]
到strings
的所有其他strings[x]
,它使用此列表。例如:
>>> (len(set(strings[0][:])) < len(set(strings[1][:])))
True
这给了我们想要的顺序。
编辑:@PeterGibson上面指出list(string[i])
是不需要的。这是真的,因为字符串可以在Python中迭代,就像列表一样:
>>> set("foo")
set(['o', 'f'])
你不需要'list'。 – roippi 2014-10-02 02:12:18