我在 Python 中有一個串列串列,如下所示:
vehicle_list = [['car', '123464', '4322445'], ['car', '64346', '643267'], ['bicycle', '1357', '78543'],
['bicycle', '75325', '75425'], ['car', '8652', '652466'], ['taxi', '653367', '63226'],
['taxi', '96544', '22267'], ['taxi', '86542222', '54433'],
['motorcycle', '675422', '56312'], ['motorcycle', '53225', '88885'], ['motorcycle', '773345', '9977'],
['motorcycle', '3466', '987444'], ['truck', '2455554', '5225544'], ['truck', '2455554', '344543'],
['train', '6543355', '6336']]
我想退回最后數量最多的前 3 輛車。像這樣:
top_vehicle = [['truck', '2455554', '5225544'], ['car', '123464', '4322445'], ['motorcycle', '3466', '987444']]
我試過用這種方式排序,但結果是車輛重復,這是我不想要的。我想要排序串列中的獨特車輛。我已經嘗試過這樣的代碼:
top_vehicle = (sorted(vehicle_list, key=lambda x: int(x[-1]), reverse = True))[:3]
print(top_vehicle)
[['truck', '2455554', '5225544'], ['car', '123464', '4322445'], ['car', '8652', '652466']]
我是 Python 和學習的新手。有人可以幫我嗎?非常感謝。
uj5u.com熱心網友回復:
方法通過
- 獲取車輛專案末尾編號最大的專案
- 按專案末尾的數字對字典的值進行反向排序
- 獲取前三項
vehicle_list = [['car', '123464', '4322445'], ['car', '64346', '643267'], ['bicycle', '1357', '78543'],
['bicycle', '75325', '75425'], ['car', '8652', '652466'], ['taxi', '653367', '63226'],
['taxi', '96544', '22267'], ['taxi', '86542222', '54433'],
['motorcycle', '675422', '56312'], ['motorcycle', '53225', '88885'], ['motorcycle', '773345', '9977'],
['motorcycle', '3466', '987444'], ['truck', '2455554', '5225544'], ['truck', '2455554', '344543'],
['train', '6543355', '6336']]
# Get largest one for each vehicle by dictionary
largest = {}
for item, no1, no2 in vehicle_list:
if (item in largest and int(largest[item][2]) < int(no2)) or (item not in largest):
largest[item] = [item, no1, no2]
# Reverse sort list by 3rd value and get first three
top_vehicle = sorted(list(largest.values()), key=lambda x:int(x[2]), reverse=True)[:3]
print(top_vehicle)
# [['truck', '2455554', '5225544'], ['car', '123464', '4322445'], ['motorcycle', '3466', '987444']]
uj5u.com熱心網友回復:
獲得已排序車輛的串列后,您可以回圈瀏覽它。top_vehicles如果之前未添加車輛型別,則僅將車輛元組附加到串列中
sorted_vehicles = sorted(vehicle_list, key=lambda x: int(x[-1]), reverse=True)
unique = set()
top_vehicles = []
for vehicle_type, _, number in sorted_vehicles:
if (vehicle_type in unique): # if the type of vehicle has already been seen
continue
unique.add(vehicle_type) # if it has not been seen, add it to the list of seen vehicle types
top_vehicles.append([vehicle_type, _, number]) # add it to the list of top_vehicles
if (len(unique) == 3): # get only the top 3
break
print(top_vehicles)
# [['truck', '2455554', '5225544'], ['car', '123464', '4322445'], ['motorcycle', '3466', '987444']]
我注意到我的程式的輸出與你的不匹配,但我認為你的摩托車是不正確的,因為 987444 > 88885。
uj5u.com熱心網友回復:
- 使用
dict;按車輛型別分組 - 選擇每種車輛型別的最大元素;
- 從最大元素串列中獲取前 3 個元素。
要獲取前三個元素,您可以像以前一樣進行排序,或者使用heapq.nlargest.
from heapq import nlargest
from operator import itemgetter
vehicle_list = [['car', '123464', '4322445'], ['car', '64346', '643267'], ['bicycle', '1357', '78543'],
['bicycle', '75325', '75425'], ['car', '8652', '652466'], ['taxi', '653367', '63226'],
['taxi', '96544', '22267'], ['taxi', '86542222', '54433'],
['motorcycle', '675422', '56312'], ['motorcycle', '53225', '88885'], ['motorcycle', '773345', '9977'],
['motorcycle', '3466', '987444'], ['truck', '2455554', '5225544'], ['truck', '2455554', '344543'],
['train', '6543355', '6336']]
grouped = {}
for v,x,y in vehicle_list:
grouped.setdefault(v, []).append((v,int(x),int(y)))
# {'car': [('car', 123464, 4322445), ('car', 64346, 643267), ('car', 8652, 652466)],
# 'bicycle': [('bicycle', 1357, 78543), ('bicycle', 75325, 75425)],
# 'taxi': [('taxi', 653367, 63226), ('taxi', 96544, 22267), ('taxi', 86542222, 54433)],
# 'motorcycle': [('motorcycle', 675422, 56312), ('motorcycle', 53225, 88885), ('motorcycle', 773345, 9977), ('motorcycle', 3466, 987444)],
# 'truck': [('truck', 2455554, 5225544), ('truck', 2455554, 344543)],
# 'train': [('train', 6543355, 6336)]}
max_vehicles = [max(l, key=itemgetter(2)) for l in grouped.values()]
# [('car', 123464, 4322445), ('bicycle', 1357, 78543), ('taxi', 653367, 63226), ('motorcycle', 3466, 987444), ('truck', 2455554, 5225544), ('train', 6543355, 6336)]
top3 = nlargest(3, max_vehicles, key=itemgetter(2))
# [('truck', 2455554, 5225544), ('car', 123464, 4322445), ('motorcycle', 3466, 987444)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489013.html
