我很困惑,爲什麼下面的代碼需要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