這個問題在這里已經有了答案: list.sort(key=list.count) 如何在 Python 3.x 中作業? (3 個回答) 昨天關門。
# A function that returns the frequency of each value:
def myFunc(e):
return cars.count(e)
cars = ['Ford', 'Ford', 'Ford', 'Mitsubishi','Mitsubishi', 'BMW', 'VW']
cars.sort(key=myFunc)
print(cars)
輸出:
['Ford', 'Ford', 'Ford', 'Mitsubishi', 'Mitsubishi', 'BMW', 'VW']
我的期望:
['BMW', 'VM', 'Mitsubishi', 'Mitsubishi', 'Ford', 'Ford', 'Ford']
計數:
Ford - 3
Mitsubishi - 2
BMW - 1
VM - 1
它應該按串列中計數的升序排序。
uj5u.com熱心網友回復:
問題是您cars在 key 函式內部使用,但是.sort就地。這會導致cars對關鍵函式的中間呼叫不可靠。
如果我們cars在 key 函式內部列印,我們可以看到問題:
def myFunc(e):
print(cars)
return cars.count(e)
cars = ['Ford', 'Ford', 'Ford', 'Mitsubishi', 'Mitsubishi', 'BMW', 'VW']
cars.sort(key=myFunc)
這輸出
[]
[]
[]
[]
[]
[]
[]
所以無論傳遞什么元素cars.count都會回傳,并且串列將保留其原始順序。0
sorted(...)未就地使用:
def myFunc(e):
return cars.count(e)
cars = ['Ford', 'Ford', 'Ford', 'Mitsubishi', 'Mitsubishi', 'BMW', 'VW']
cars = sorted(cars, key=myFunc)
print(cars)
這輸出
['BMW', 'VW', 'Mitsubishi', 'Mitsubishi', 'Ford', 'Ford', 'Ford']
作為旁注,在這種情況下,您可以cars.count直接使用,而無需定義包裝函式:
cars = sorted(cars, key=cars.count)
uj5u.com熱心網友回復:
此問題來自您在修改函式時參考了該函式中的汽車這一事實。
如果您獲得副本,則不會發生這種情況:
def myFunc(e):
return cars.count(e)
cars = ['Ford', 'Ford', 'Ford', 'Mitsubishi','Mitsubishi', 'BMW', 'VW']
cars2 = cars.copy()
cars2.sort(key=myFunc)
print(cars2)
# ['BMW', 'VW', 'Mitsubishi', 'Mitsubishi', 'Ford', 'Ford', 'Ford']
也就是說,這種方法效率不高,因為您需要再次閱讀每個元素的整個串列。
改用計數器:
from collections import Counter
cars = ['Ford', 'Ford', 'Ford', 'Mitsubishi','Mitsubishi', 'BMW', 'VW']
c = Counter(cars)
cars.sort(key=c.get)
print(cars)
# ['BMW', 'VW', 'Mitsubishi', 'Mitsubishi', 'Ford', 'Ford', 'Ford']
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437127.html
