题目背景:
你的任务是按照列表中数字的频率对列表进行排序。如果几个数字的频率相等,则应根据其自然顺序进行排序。例如:[5,2,4,1,1,1,3]==>[1,1,1,2,3,4,5](意思就是按列表中元素个数的多少进行排序,从多到少,如果元素个数相同则按自然数的顺序从小到大排)
这个是变式:Sort Array by Element Frequency(根据列表元素数量排序,频率相等则按原位置顺序排)
Example:
frequency_sorting([5, 3, 8, 11, 5, 6, 6, 5]) == [5, 5, 5, 6, 6, 3, 8, 11]
代码实现:
法一:用冒泡排序和集合
def frequency_sorting(numbers):
temp=list(set(numbers))
for i in range(1,len(temp)):
for j in range(0,len(temp)-i):
if numbers.count(temp[j])<numbers.count(temp[j+1]):
temp[j],temp[j+1]=temp[j+1],temp[j]
if numbers.count(temp[j])==numbers.count(temp[j+1]) and temp[j]>temp[j+1]:
temp[j],temp[j+1]=temp[j+1],temp[j]
#这一步等于在set后面一行temp.sort()
lists=[]
for i in temp:
for j in range(numbers.count(i)):
lists.append(i)
return lists
if __name__ == "__main__":
print("Example:")
print(frequency_sorting([1, 2, 3, 4, 5]))
# These "asserts" using only for self-checking and not necessary for auto-testing
assert frequency_sorting([1, 2, 3, 4, 5]) == [1, 2, 3, 4, 5], "Already sorted"
assert frequency_sorting([3, 4, 11, 13, 11, 4, 4, 7, 3]) == [
4,
4,
4,
3,
3,
11,
11,
7,
13,
], "Not sorted"
assert frequency_sorting([99, 99, 55, 55, 21, 21, 10, 10]) == [
10,
10,
21,
21,
55,
55,
99,
99,
], "Reversed"
print("Coding complete? Click 'Check' to earn cool rewards!")
法二:用变式的字典法(这个方法可以说是通用的)
def frequency_sort(items):
dicts={i:items.count(i) for i in items}
dicts=dict(sorted(dicts.items(),key=lambda x:x[0],reverse=False))
dicts=dict(sorted(dicts.items(),key=lambda x:x[1],reverse=True))
lists=[]
for i in dicts:
for j in range(dicts[i]):
lists.append(i)
return lists
print(frequency_sort([99, 99, 55, 55, 21, 21, 10, 10]))
思路分析:
其实这两个解法都先是把列表中的重复元素删除得到单一元素的列表,要想删除元素中的重复元素,由上述解法知道有字典法和集合法,还有一种比较好的方法是逻辑判断法:
def setlist(list1):
for i in list1:
if i not in list2:
list2.append(i)
return list2
然后得到了所有单一元素的列表后,按元素个数的多少进行高到低的排序,当元素个数一样的时候,这里的题目是按自然数从小到大的顺序排列即count相等时,冒泡交换的条件是j>j+1。
Best Code:
def checkio(numbers):
return sorted(sorted(numbers), key=numbers.count, reverse=True)
def frequency_sorting(numbers):
return sorted(numbers, key=lambda a: (-numbers.count(a), a))