Следующее может быть сделано шаг за шагом, несколько неуклюжий, но мне интересно, есть ли элегантный способ сделать это.
Существует страница: http://www.mariowiki.com/Mario_Kart_Wii, где есть 2 таблицы... есть
Mario - 6 2 2 3 - -
Luigi 2 6 - - - - -
Diddy Kong - - 3 - 3 - 5
[...]
Название "Mario" и т.д. - имена персонажей Марио Карта Wii. Цифры для бонусных очков для:
Speed Weight Acceleration Handling Drift Off-Road Mini-Turbo
а затем есть таблица 2
Standard Bike S 39 21 51 51 54 43 48
Bullet Bike 53 24 32 35 67 29 67
Bubble Bike / Jet Bubble 48 27 40 40 45 35 37
[...]
Это также характеристики для велосипеда или карты.
Интересно, какое самое элегантное решение для поиска всех максимальных комбинаций скорости, веса, ускорения и т.д., а также для минимума, либо напрямую используя HTML на этой странице, либо копируя и вставляя числа в текстовый файл.
Собственно, в этой таблице персонажей Марио Бауэр-младший - все средние персонажи, Baby Mario to Dry Bones - это маленькие персонажи, а остальные - большие персонажи, за исключением маленьких, средних или больших Mii. имя говорит. Маленькие персонажи могут ездить только на маленьком велосипеде или маленьком картинге и т.д. Для средних и больших.
Обновление: было бы неплохо также отфильтровать только тип Kart или Bike при печати результатов, так как некоторые люди играют только с байками и только для дрейфа "in" или "out" типа для велосипедов, так как некоторые люди играют только с использованием типа "в дрифте". Также приятно распечатать результат, который имеет такое же максимальное или минимальное значение (разные символы на разных картинах или байках, которые добавляют к одному и тому же значению). Ответ Хью на печать верхних значений и нижних значений тоже хорош, так как некоторые из значений довольно близки, например 73 или 72.
В вашей проблеме есть две части. Анализ HTML и анализ. Разбор HTML-это утомительная работа, и я подозреваю, что не так много, что вы можете сделать, чтобы сделать ее изящной. Анализ непросто, но есть несколько способов сделать это в Python, который, я думаю, можно считать элегантным. Я собираюсь обсудить способы выражения анализа грубой силы в элегантном и сжатом виде. Я не буду обсуждать способы сделать это быстрее, чем грубая сила, потому что набор данных настолько крошечный.
import collections
Stats = collections.namedtuple("Stats", "speed weight acceleration handling drift offroad turbo")
Сначала мы создаем именованный кортеж под названием "Статистика". Это объект, который мы будем использовать для представления статистики водителя или транспортного средства. Именованные кортежи хороши, потому что:
driver.weight
__str__
: "Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)"
Определить функцию для добавления двух наборов статистики:
def add_stats(xs, ys):
return Stats(*[(x+y) for (x,y) in zip(xs,ys)])
Zip принимает две последовательности и возвращает последовательность пар элементов из каждой последовательности. Например. zip ([1,2,3], ['a', 'b', 'c']) == [(1, 'a'), (2, 'b'), (3, c) ]). Затем мы используем понимание списка ([blah for blah in blah]
), чтобы добавить статистику каждой из этих пар. Наконец, мы передаем это конструктору Stats. * Означает, что мы хотим использовать каждый элемент в последовательности в качестве аргумента функции.
class ThingWithStats(object):
def __init__(self, name, stats):
self.name = name
self.stats = Stats(*stats)
def __str__(self):
return self.name + " (" + str(self.stats) + ")"
class Driver(ThingWithStats):
pass
class Vehicle(ThingWithStats):
pass
class Combination(ThingWithStats):
def __init__(self, driver, vehicle):
self.name = driver.name + " riding " + vehicle.name
self.stats = add_stats(driver.stats, vehicle.stats)
Теперь мы определили классы для представления драйверов, транспортных средств и их комбинаций. Обратите внимание, что конструкторы для Driver and Vehicle (унаследованные от ThingWithStats) могут принимать любую последовательность соответствующей длины в качестве аргумента stats
. Они используют *
для преобразования последовательности в объект stats
. Посмотрим, почему это удобно в ближайшее время.
def make_combinations(drivers, vehicles):
return [
Combination(driver, vehicle)
for driver in drivers
for vehicle in vehicles]
Эта функция использует понимание списка, чтобы найти все комбинации некоторого списка драйверов и некоторого списка транспортных средств. Обратите внимание, что, используя несколько "for" s в одном понимании, мы получаем все комбинации. Это также иногда называют декартовым произведением.
Теперь вот скудный бит - данные. Я скопировал и вставил их и использовал магию vim, чтобы массировать их в правильном формате. Извините, у меня нет ничего более умного для этого. Обратите внимание, что для аргумента stats
мы передаем правильный кортеж. Как упоминалось выше, конструктор преобразуется в объект stats
. Здесь мы немного помешали.
medium_drivers = [
Driver("Mario", (0, 6, 2, 2, 3, 0, 0)),
Driver("Luigi", (2, 6, 0, 0, 0, 0, 0)),
Driver("Peach", (2, 0, 5, 0, 6, 0, 0)),
Driver("Daisy", (4, 0, 0, 2, 0, 0, 3)),
Driver("Yoshi", (0, 3, 0, 0, 3, 5, 0)),
Driver("Birdo", (0, 3, 0, 0, 0, 3, 5)),
Driver("Diddy Kong", (0, 0, 3, 0, 3, 0, 5)),
Driver("Bowser Jr.", (0, 0, 0, 0, 0, 3, 3)),
Driver("Medium Mii", (3, 3, 0, 0, 0, 3, 3)),
]
small_drivers = [
Driver("Baby Mario", (0, 8, 0, 6, 0, 0, 0)),
Driver("Baby Luigi", (5, 8, 0, 0, 0, 0, 0)),
Driver("Baby Peach", (3, 6, 3, 3, 0, 0, 0)),
Driver("Baby Daisy", (5, 6, 0, 0, 0, 0, 3)),
Driver("Toad", (0, 0, 6, 0, 6, 0, 0)),
Driver("Toadette", (3, 0, 0, 0, 0, 6, 0)),
Driver("Koopa Troopa", (0, 0, 0, 3, 0, 0, 6)),
Driver("Dry Bones", (0, 0, 3, 0, 3, 0, 6)),
Driver("Small Mii", (3, 3, 0, 0, 3, 0, 3)),
]
large_drivers = [
Driver("Wario", (0, 3, 0, 0, 0, 3, 6)),
Driver("Waluigi", (0, 0, 6, 0, 5, 3, 0)),
Driver("Donkey Kong", (0, 3, 2, 2, 0, 0, 3)),
Driver("Bowser", (2, 5, 0, 0, 3, 0, 0)),
Driver("King Boo", (0, 0, 0, 5, 0, 3, 0)),
Driver("Rosalina", (3, 0, 0, 3, 0, 0, 3)),
Driver("Funky Kong", (4, 0, 0, 0, 0, 3, 0)),
Driver("Dry Bowser", (0, 0, 0, 0, 0, 6, 6)),
Driver("Large Mii", (3, 0, 3, 3, 3, 0, 3)),
]
small_vehicles = [
Vehicle("Standard Kart S", (41, 29, 48, 48, 51, 40, 45)),
Vehicle("Baby Booster / Booster Seat", (27, 27, 56, 64, 37, 54, 59)),
Vehicle("Concerto / Mini Beast", (55, 32, 29, 32, 64, 27, 64)),
Vehicle("Cheep Charger", (34, 24, 64, 56, 59, 45, 54)),
Vehicle("Rally Romper / Tiny Titan", (46, 35, 43, 43, 29, 64, 40)),
Vehicle("Blue Falcon", (60, 29, 35, 29, 43, 24, 29)),
Vehicle("Standard Bike S", (39, 21, 51, 51, 54, 43, 48)),
Vehicle("Bullet Bike", (53, 24, 32, 35, 67, 29, 67)),
Vehicle("Nano Bike / Bit Bike", (25, 18, 59, 67, 40, 56, 62)),
Vehicle("Quacker", (32, 17, 67, 60, 62, 48, 57)),
Vehicle("Magikruiser", (43, 24, 45, 45, 32, 67, 43)),
Vehicle("Bubble Bike / Jet Bubble", (48, 27, 40, 40, 45, 35, 37)),
]
medium_vehicles = [
Vehicle("Standard Kart M", (46, 45, 40, 43, 45, 35, 40)),
Vehicle("Nostalgia 1 / Classic Dragster", (37, 43, 59, 54, 54, 40, 51)),
Vehicle("Wild Wing", (57, 51, 21, 29, 59, 24, 59)),
Vehicle("Turbo Blooper / Super Blooper", (50, 40, 35, 37, 21, 54, 35)),
Vehicle("Royal Racer / Daytripper", (34, 45, 51, 59, 32, 48, 54)),
Vehicle("B Dasher Mk. 2 / Sprinter", (64, 48, 27, 24, 37, 21, 24)),
Vehicle("Standard Bike M", (43, 37, 43, 45, 48, 37, 43)),
Vehicle("Mach Bike", (55, 37, 24, 32, 62, 27, 62)),
Vehicle("Bon Bon / Sugarscoot", (32, 32, 54, 62, 35, 51, 56)),
Vehicle("Rapide / Zip Zip", (41, 35, 45, 51, 29, 62, 45)),
Vehicle("Nitrocycle / Sneakster", (62, 40, 29, 27, 40, 24, 27)),
Vehicle("Dolphin Dasher", (48, 43, 37, 40, 24, 56, 37)),
]
large_vehicles = [
Vehicle("Standard Kart L", (48, 59, 37, 40, 40, 35, 35)),
Vehicle("Offroader", (39, 64, 48, 54, 18, 43, 45)),
Vehicle("Flame Flyer", (62, 59, 16, 21, 48, 18, 48)),
Vehicle("Piranha Prowler", (55, 67, 29, 35, 35, 29, 27)),
Vehicle("Aero Glider / Jetsetter", (69, 56, 21, 17, 27, 16, 16)),
Vehicle("Dragonetti / Honeycoupe", (53, 62, 27, 29, 56, 24, 56)),
Vehicle("Standard Bike L", (46, 54, 40, 43, 43, 37, 37)),
Vehicle("Bowser Bike / Flame Runner", (60, 54, 18, 24, 51, 21, 51)),
Vehicle("Wario Bike", (37, 59, 51, 56, 21, 45, 48)),
Vehicle("Twinkle Star / Shooting Star", (50, 48, 29, 32, 59, 27, 59)),
Vehicle("Torpedo / Spear", (67, 56, 24, 18, 29, 18, 18)),
Vehicle("Phantom", (43, 51, 43, 48, 17, 56, 40)),
]
С этой целью мы составляем списки всех комбинаций:
small_combinations = make_combinations(small_drivers, small_vehicles)
medium_combinations = make_combinations(medium_drivers, medium_vehicles)
large_combinations = make_combinations(large_drivers, large_vehicles)
all_combinations = small_combinations + medium_combinations + large_combinations
Наконец, мы делаем базовый анализ в списке всех комбинаций:
print "Max speed:", max(all_combinations, key=lambda c:c.stats.speed)
print "Max weight:", max(all_combinations, key=lambda c:c.stats.weight)
print "Max acceleration:", max(all_combinations, key=lambda c:c.stats.acceleration)
print "Max handling:", max(all_combinations, key=lambda c:c.stats.handling)
print "Max drift:", max(all_combinations, key=lambda c:c.stats.drift)
print "Max offroad:", max(all_combinations, key=lambda c:c.stats.offroad)
print "Max turbo:", max(all_combinations, key=lambda c:c.stats.turbo)
print
print "Min speed:", min(all_combinations, key=lambda c:c.stats.speed)
print "Min weight:", min(all_combinations, key=lambda c:c.stats.weight)
print "Min acceleration:", min(all_combinations, key=lambda c:c.stats.acceleration)
print "Min handling:", min(all_combinations, key=lambda c:c.stats.handling)
print "Min drift:", min(all_combinations, key=lambda c:c.stats.drift)
print "Min offroad:", min(all_combinations, key=lambda c:c.stats.offroad)
print "Min turbo:", min(all_combinations, key=lambda c:c.stats.turbo)
Функции min
и max
предоставляют аргумент key
для этой цели. Он принимает функцию, которая берет элемент из списка и возвращает значение, которое вы хотите отсортировать. Вот результаты:
Max speed: Funky Kong riding Aero Glider / Jetsetter (Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16))
Max weight: Bowser riding Piranha Prowler (Stats(speed=57, weight=72, acceleration=29, handling=35, drift=38, offroad=29, turbo=27))
Max acceleration: Toad riding Quacker (Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57))
Max handling: Baby Mario riding Nano Bike / Bit Bike (Stats(speed=25, weight=26, acceleration=59, handling=73, drift=40, offroad=56, turbo=62))
Max drift: Toad riding Bullet Bike (Stats(speed=53, weight=24, acceleration=38, handling=35, drift=73, offroad=29, turbo=67))
Max offroad: Toadette riding Magikruiser (Stats(speed=46, weight=24, acceleration=45, handling=45, drift=32, offroad=73, turbo=43))
Max turbo: Koopa Troopa riding Bullet Bike (Stats(speed=53, weight=24, acceleration=32, handling=38, drift=67, offroad=29, turbo=73))
Min speed: Baby Mario riding Nano Bike / Bit Bike (Stats(speed=25, weight=26, acceleration=59, handling=73, drift=40, offroad=56, turbo=62))
Min weight: Toad riding Quacker (Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57))
Min acceleration: Wario riding Flame Flyer (Stats(speed=62, weight=62, acceleration=16, handling=21, drift=48, offroad=21, turbo=54))
Min handling: Wario riding Aero Glider / Jetsetter (Stats(speed=69, weight=59, acceleration=21, handling=17, drift=27, offroad=19, turbo=22))
Min drift: Wario riding Phantom (Stats(speed=43, weight=54, acceleration=43, handling=48, drift=17, offroad=59, turbo=46))
Min offroad: Donkey Kong riding Aero Glider / Jetsetter (Stats(speed=69, weight=59, acceleration=23, handling=19, drift=27, offroad=16, turbo=19))
Min turbo: Waluigi riding Aero Glider / Jetsetter (Stats(speed=69, weight=56, acceleration=27, handling=17, drift=32, offroad=19, turbo=16))
Другие идеи
Если вы хотите применить это к гораздо большему набору данных, вы можете найти драйвер и автомобиль с минимальным и максимальным для каждого стата, а затем для каждого стата объедините максимальный драйвер с максимальным автомобилем и мини-драйвером с мин. Это будет O (M log M + N log N) вместо O (M * N log M * N). Но вам действительно нужно будет подходить к тысячам водителей и транспортных средств, прежде чем я думаю, что это будет проблемой.
Если вы хотите применить это к массивным наборам данных, которые даже не поместились в память, вы могли бы использовать выражения генератора вместо понимания списков. Вам нужно будет объединить это с синтаксическим анализатором, который может читать и выводить один драйвер/автомобиль за раз.
Вы можете выполнить более конкретные поиски, добавив ограничения. Например, чтобы найти самую быструю комбинацию с turbo >= 50 и обработкой >= 40:
max((combination
for combination in all_combinations
if combination.stats.turbo >= 50
and combination.stats.handling >= 40),
key=lambda c:c.stats.speed)
Если вы хотите, чтобы все те были привязаны к первому месту, вы могли бы сделать что-то вроде этого:
def all_max(sequence, key):
top_value = key(max(sequence, key=key))
return [item for item in sequence if key(item) == top_value]
Назовите его так же, как вы бы набрали max
. Он возвращает список всех этих элементов, привязанных к максимальному значению любого ключа.
Я добавил расширенный ответ @Weeble несколькими способами:
.
from BeautifulSoup import BeautifulSoup
import urllib2
import collections
import itertools
def value(s):
"Parse string to integer (return 0 on bad string)"
try:
return int(s)
except ValueError:
return 0
attrs = ('speed','weight','acceleration','handling','drift','offroad','turbo')
Stats = collections.namedtuple('Stats', attrs)
def add_stats(xs,ys):
return Stats(*(x+y for x,y in zip(xs,ys)))
class ThingWithStats(object):
def __init__(self, stats):
super(ThingWithStats,self).__init__()
self.stats = Stats(*stats)
def __str__(self):
return str(self.stats)
class Driver(ThingWithStats):
@classmethod
def fromRow(cls,size,row):
name = row.th.getText().strip()
stats = [value(col.getText()) for col in row.findAll('td')]
return cls(name, size, stats)
def __init__(self, name, size, stats):
super(Driver,self).__init__(stats)
self.name = name
self.size = size
def __str__(self):
return "{0:32} ({1}): {2}".format(self.name, self.size, self.stats)
class Vehicle(ThingWithStats):
@classmethod
def fromRow(cls, size, kind, row):
items = [col.getText() for col in row.findAll('td')]
name = items[0].strip()
stats = [value(item) for item in items[1:8]]
return cls(name, size, kind, stats)
def __init__(self, name, size, kind, stats):
super(Vehicle,self).__init__(stats)
self.name = name
self.size = size
self.kind = kind
def __str__(self):
return "{0:30} ({1} {2}): {3}".format(self.name, self.size, self.kind, self.stats)
class DrivenVehicle(ThingWithStats):
def __init__(self, driver, vehicle):
if driver.size != vehicle.size:
raise ValueError('Driver {0} cannot fit vehicle {1}'.format(driver.name, vehicle.name))
self.driver = driver
self.vehicle = vehicle
self.stats = add_stats(driver.stats, vehicle.stats)
def __str__(self):
return "{0} riding {1}: {2}".format(self.driver.name, self.vehicle.name, self.stats)
def getDrivers(table):
rows = table.findAll('tr')[2:] # skip two header rows
sizes = 'm'*8 + 's'*8 + 'l'*8 + 'sml' # this is cheating a bit, but I don't see any way to get it from the table
return [Driver.fromRow(size,row) for size,row in zip(sizes,rows)]
def getVehicles(table):
sz = {'Small':'s', 'Medium':'m', 'Large':'l'}
kd = {'Karts':'k', 'Bikes':'b'}
size,kind = None,None
cars = []
for row in table.findAll('tr'):
heads = row.findAll('th')
if len(heads)==1: # main table heading
pass
elif len(heads)==10: # sub-heading
s,k = heads[0].getText().strip().split()
size,kind = sz[s], kd[k]
else: # data
cars.append(Vehicle.fromRow(size,kind,row))
return cars
def getData():
url = 'http://www.mariowiki.com/Mario_Kart_Wii' # page to look at
data = urllib2.urlopen(url).read() # get raw html
soup = BeautifulSoup(data) # parse
drivers = []
cars = []
for table in soup.findAll('table'): # look at all tables in page
try:
head = table.th.getText()
if 'Character Bonuses' in head:
drivers = getDrivers(table)
elif 'Vehicle Stats' in head:
cars = getVehicles(table)
except AttributeError:
pass
return drivers,cars
def binBy(attr, lst):
res = collections.defaultdict(list)
for item in lst:
res[getattr(item,attr)].append(item)
return res
def main():
drivers,cars = getData()
drivers = binBy('size', drivers)
cars = binBy('size', cars)
sizes = list(set(drivers.keys()) & set(cars.keys()))
sizes.sort()
combos = {}
for size in sizes:
combos[size] = [DrivenVehicle(driver,car) for driver,car in itertools.product(drivers[size], cars[size])]
topN = 3
for attr in attrs:
print "By {0}:".format(attr)
for size in sizes:
combos[size].sort(key=lambda dv: getattr(dv.stats,attr), reverse=True)
print " ({0})".format(size)
for dv in combos[size][:topN]:
print ' '+str(dv)
print ' ...'
for dv in combos[size][-topN:]:
print ' '+str(dv)
if __name__=="__main__":
main()
и конечные результаты:
By speed:
(l)
Funky Kong riding Aero Glider/ Jetsetter: Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)
Rosalina riding Aero Glider/ Jetsetter: Stats(speed=72, weight=56, acceleration=21, handling=20, drift=27, offroad=16, turbo=19)
Large Mii riding Aero Glider/ Jetsetter: Stats(speed=72, weight=56, acceleration=24, handling=20, drift=30, offroad=16, turbo=19)
...
Donkey Kong riding Wario Bike: Stats(speed=37, weight=62, acceleration=53, handling=58, drift=21, offroad=45, turbo=51)
King Boo riding Wario Bike: Stats(speed=37, weight=59, acceleration=51, handling=61, drift=21, offroad=48, turbo=48)
Dry Bowser riding Wario Bike: Stats(speed=37, weight=59, acceleration=51, handling=56, drift=21, offroad=51, turbo=54)
(m)
Daisy riding B Dasher Mk. 2/ Sprinter: Stats(speed=68, weight=48, acceleration=27, handling=26, drift=37, offroad=21, turbo=27)
Medium Mii riding B Dasher Mk. 2/ Sprinter: Stats(speed=67, weight=51, acceleration=27, handling=24, drift=37, offroad=24, turbo=27)
Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
...
Birdo riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=35, acceleration=54, handling=62, drift=35, offroad=54, turbo=61)
Diddy Kong riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=57, handling=62, drift=38, offroad=51, turbo=61)
Bowser Jr. riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=54, handling=62, drift=35, offroad=54, turbo=59)
(s)
Baby Luigi riding Blue Falcon: Stats(speed=65, weight=37, acceleration=35, handling=29, drift=43, offroad=24, turbo=29)
Baby Daisy riding Blue Falcon: Stats(speed=65, weight=35, acceleration=35, handling=29, drift=43, offroad=24, turbo=32)
Baby Peach riding Blue Falcon: Stats(speed=63, weight=35, acceleration=38, handling=32, drift=43, offroad=24, turbo=29)
...
Toad riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=65, handling=67, drift=46, offroad=56, turbo=62)
Koopa Troopa riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=59, handling=70, drift=40, offroad=56, turbo=68)
Dry Bones riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=62, handling=67, drift=43, offroad=56, turbo=68)
By weight:
(l)
Bowser riding Piranha Prowler: Stats(speed=57, weight=72, acceleration=29, handling=35, drift=38, offroad=29, turbo=27)
Wario riding Piranha Prowler: Stats(speed=55, weight=70, acceleration=29, handling=35, drift=35, offroad=32, turbo=33)
Donkey Kong riding Piranha Prowler: Stats(speed=55, weight=70, acceleration=31, handling=37, drift=35, offroad=29, turbo=30)
...
Waluigi riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=35, handling=32, drift=64, offroad=30, turbo=59)
King Boo riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=29, handling=37, drift=59, offroad=30, turbo=59)
Dry Bowser riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=29, handling=32, drift=59, offroad=33, turbo=65)
(m)
Luigi riding Wild Wing: Stats(speed=59, weight=57, acceleration=21, handling=29, drift=59, offroad=24, turbo=59)
Mario riding Wild Wing: Stats(speed=57, weight=57, acceleration=23, handling=31, drift=62, offroad=24, turbo=59)
Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
...
Peach riding Bon Bon/ Sugarscoot: Stats(speed=34, weight=32, acceleration=59, handling=62, drift=41, offroad=51, turbo=56)
Diddy Kong riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=57, handling=62, drift=38, offroad=51, turbo=61)
Bowser Jr. riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=54, handling=62, drift=35, offroad=54, turbo=59)
(s)
Baby Luigi riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=43, acceleration=43, handling=43, drift=29, offroad=64, turbo=40)
Baby Mario riding Rally Romper/ Tiny Titan: Stats(speed=46, weight=43, acceleration=43, handling=49, drift=29, offroad=64, turbo=40)
Baby Daisy riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=41, acceleration=43, handling=43, drift=29, offroad=64, turbo=43)
...
Toad riding Quacker: Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57)
Koopa Troopa riding Quacker: Stats(speed=32, weight=17, acceleration=67, handling=63, drift=62, offroad=48, turbo=63)
Dry Bones riding Quacker: Stats(speed=32, weight=17, acceleration=70, handling=60, drift=65, offroad=48, turbo=63)
By acceleration:
(l)
Waluigi riding Wario Bike: Stats(speed=37, weight=59, acceleration=57, handling=56, drift=26, offroad=48, turbo=48)
Waluigi riding Offroader: Stats(speed=39, weight=64, acceleration=54, handling=54, drift=23, offroad=46, turbo=45)
Large Mii riding Wario Bike: Stats(speed=40, weight=59, acceleration=54, handling=59, drift=24, offroad=45, turbo=51)
...
Rosalina riding Flame Flyer: Stats(speed=65, weight=59, acceleration=16, handling=24, drift=48, offroad=18, turbo=51)
King Boo riding Flame Flyer: Stats(speed=62, weight=59, acceleration=16, handling=26, drift=48, offroad=21, turbo=48)
Dry Bowser riding Flame Flyer: Stats(speed=62, weight=59, acceleration=16, handling=21, drift=48, offroad=24, turbo=54)
(m)
Peach riding Nostalgia 1/ Classic Dragster: Stats(speed=39, weight=43, acceleration=64, handling=54, drift=60, offroad=40, turbo=51)
Diddy Kong riding Nostalgia 1/ Classic Dragster: Stats(speed=37, weight=43, acceleration=62, handling=54, drift=57, offroad=40, turbo=56)
Mario riding Nostalgia 1/ Classic Dragster: Stats(speed=37, weight=49, acceleration=61, handling=56, drift=57, offroad=40, turbo=51)
...
Birdo riding Wild Wing: Stats(speed=57, weight=54, acceleration=21, handling=29, drift=59, offroad=27, turbo=64)
Daisy riding Wild Wing: Stats(speed=61, weight=51, acceleration=21, handling=31, drift=59, offroad=24, turbo=62)
Bowser Jr. riding Wild Wing: Stats(speed=57, weight=51, acceleration=21, handling=29, drift=59, offroad=27, turbo=62)
(s)
Toad riding Quacker: Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57)
Toad riding Cheep Charger: Stats(speed=34, weight=24, acceleration=70, handling=56, drift=65, offroad=45, turbo=54)
Baby Peach riding Quacker: Stats(speed=35, weight=23, acceleration=70, handling=63, drift=62, offroad=48, turbo=57)
...
Small Mii riding Concerto/ Mini Beast: Stats(speed=58, weight=35, acceleration=29, handling=32, drift=67, offroad=27, turbo=67)
Toadette riding Concerto/ Mini Beast: Stats(speed=58, weight=32, acceleration=29, handling=32, drift=64, offroad=33, turbo=64)
Koopa Troopa riding Concerto/ Mini Beast: Stats(speed=55, weight=32, acceleration=29, handling=35, drift=64, offroad=27, turbo=70)
By handling:
(l)
King Boo riding Wario Bike: Stats(speed=37, weight=59, acceleration=51, handling=61, drift=21, offroad=48, turbo=48)
Large Mii riding Wario Bike: Stats(speed=40, weight=59, acceleration=54, handling=59, drift=24, offroad=45, turbo=51)
Rosalina riding Wario Bike: Stats(speed=40, weight=59, acceleration=51, handling=59, drift=21, offroad=45, turbo=51)
...
Wario riding Aero Glider/ Jetsetter: Stats(speed=69, weight=59, acceleration=21, handling=17, drift=27, offroad=19, turbo=22)
Funky Kong riding Aero Glider/ Jetsetter: Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)
Dry Bowser riding Aero Glider/ Jetsetter: Stats(speed=69, weight=56, acceleration=21, handling=17, drift=27, offroad=22, turbo=22)
(m)
Mario riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=38, acceleration=56, handling=64, drift=38, offroad=51, turbo=56)
Daisy riding Bon Bon/ Sugarscoot: Stats(speed=36, weight=32, acceleration=54, handling=64, drift=35, offroad=51, turbo=59)
Peach riding Bon Bon/ Sugarscoot: Stats(speed=34, weight=32, acceleration=59, handling=62, drift=41, offroad=51, turbo=56)
...
Yoshi riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=51, acceleration=27, handling=24, drift=40, offroad=26, turbo=24)
Birdo riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=51, acceleration=27, handling=24, drift=37, offroad=24, turbo=29)
Bowser Jr. riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=48, acceleration=27, handling=24, drift=37, offroad=24, turbo=27)
(s)
Baby Mario riding Nano Bike/ Bit Bike: Stats(speed=25, weight=26, acceleration=59, handling=73, drift=40, offroad=56, turbo=62)
Baby Peach riding Nano Bike/ Bit Bike: Stats(speed=28, weight=24, acceleration=62, handling=70, drift=40, offroad=56, turbo=62)
Koopa Troopa riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=59, handling=70, drift=40, offroad=56, turbo=68)
...
Baby Daisy riding Blue Falcon: Stats(speed=65, weight=35, acceleration=35, handling=29, drift=43, offroad=24, turbo=32)
Small Mii riding Blue Falcon: Stats(speed=63, weight=32, acceleration=35, handling=29, drift=46, offroad=24, turbo=32)
Toadette riding Blue Falcon: Stats(speed=63, weight=29, acceleration=35, handling=29, drift=43, offroad=30, turbo=29)
By drift:
(l)
Waluigi riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=35, handling=32, drift=64, offroad=30, turbo=59)
Large Mii riding Twinkle Star/ Shooting Star: Stats(speed=53, weight=48, acceleration=32, handling=35, drift=62, offroad=27, turbo=62)
Bowser riding Twinkle Star/ Shooting Star: Stats(speed=52, weight=53, acceleration=29, handling=32, drift=62, offroad=27, turbo=59)
...
Wario riding Phantom: Stats(speed=43, weight=54, acceleration=43, handling=48, drift=17, offroad=59, turbo=46)
Funky Kong riding Phantom: Stats(speed=47, weight=51, acceleration=43, handling=48, drift=17, offroad=59, turbo=40)
Dry Bowser riding Phantom: Stats(speed=43, weight=51, acceleration=43, handling=48, drift=17, offroad=62, turbo=46)
(m)
Peach riding Mach Bike: Stats(speed=57, weight=37, acceleration=29, handling=32, drift=68, offroad=27, turbo=62)
Mario riding Mach Bike: Stats(speed=55, weight=43, acceleration=26, handling=34, drift=65, offroad=27, turbo=62)
Diddy Kong riding Mach Bike: Stats(speed=55, weight=37, acceleration=27, handling=32, drift=65, offroad=27, turbo=67)
...
Medium Mii riding Turbo Blooper/ Super Blooper: Stats(speed=53, weight=43, acceleration=35, handling=37, drift=21, offroad=57, turbo=38)
Birdo riding Turbo Blooper/ Super Blooper: Stats(speed=50, weight=43, acceleration=35, handling=37, drift=21, offroad=57, turbo=40)
Bowser Jr. riding Turbo Blooper/ Super Blooper: Stats(speed=50, weight=40, acceleration=35, handling=37, drift=21, offroad=57, turbo=38)
(s)
Toad riding Bullet Bike: Stats(speed=53, weight=24, acceleration=38, handling=35, drift=73, offroad=29, turbo=67)
Dry Bones riding Bullet Bike: Stats(speed=53, weight=24, acceleration=35, handling=35, drift=70, offroad=29, turbo=73)
Small Mii riding Bullet Bike: Stats(speed=56, weight=27, acceleration=32, handling=35, drift=70, offroad=29, turbo=70)
...
Baby Luigi riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=43, acceleration=43, handling=43, drift=29, offroad=64, turbo=40)
Baby Daisy riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=41, acceleration=43, handling=43, drift=29, offroad=64, turbo=43)
Toadette riding Rally Romper/ Tiny Titan: Stats(speed=49, weight=35, acceleration=43, handling=43, drift=29, offroad=70, turbo=40)
By offroad:
(l)
Dry Bowser riding Phantom: Stats(speed=43, weight=51, acceleration=43, handling=48, drift=17, offroad=62, turbo=46)
Waluigi riding Phantom: Stats(speed=43, weight=51, acceleration=49, handling=48, drift=22, offroad=59, turbo=40)
King Boo riding Phantom: Stats(speed=43, weight=51, acceleration=43, handling=53, drift=17, offroad=59, turbo=40)
...
Bowser riding Aero Glider/ Jetsetter: Stats(speed=71, weight=61, acceleration=21, handling=17, drift=30, offroad=16, turbo=16)
Rosalina riding Aero Glider/ Jetsetter: Stats(speed=72, weight=56, acceleration=21, handling=20, drift=27, offroad=16, turbo=19)
Donkey Kong riding Aero Glider/ Jetsetter: Stats(speed=69, weight=59, acceleration=23, handling=19, drift=27, offroad=16, turbo=19)
(m)
Yoshi riding Rapide/ Zip Zip: Stats(speed=41, weight=38, acceleration=45, handling=51, drift=32, offroad=67, turbo=45)
Medium Mii riding Rapide/ Zip Zip: Stats(speed=44, weight=38, acceleration=45, handling=51, drift=29, offroad=65, turbo=48)
Birdo riding Rapide/ Zip Zip: Stats(speed=41, weight=38, acceleration=45, handling=51, drift=29, offroad=65, turbo=50)
...
Diddy Kong riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=48, acceleration=30, handling=24, drift=40, offroad=21, turbo=29)
Daisy riding B Dasher Mk. 2/ Sprinter: Stats(speed=68, weight=48, acceleration=27, handling=26, drift=37, offroad=21, turbo=27)
Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
(s)
Toadette riding Magikruiser: Stats(speed=46, weight=24, acceleration=45, handling=45, drift=32, offroad=73, turbo=43)
Toadette riding Rally Romper/ Tiny Titan: Stats(speed=49, weight=35, acceleration=43, handling=43, drift=29, offroad=70, turbo=40)
Toad riding Magikruiser: Stats(speed=43, weight=24, acceleration=51, handling=45, drift=38, offroad=67, turbo=43)
...
Koopa Troopa riding Blue Falcon: Stats(speed=60, weight=29, acceleration=35, handling=32, drift=43, offroad=24, turbo=35)
Baby Luigi riding Blue Falcon: Stats(speed=65, weight=37, acceleration=35, handling=29, drift=43, offroad=24, turbo=29)
Baby Daisy riding Blue Falcon: Stats(speed=65, weight=35, acceleration=35, handling=29, drift=43, offroad=24, turbo=32)
By turbo:
(l)
Dry Bowser riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=29, handling=32, drift=59, offroad=33, turbo=65)
Wario riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=51, acceleration=29, handling=32, drift=59, offroad=30, turbo=65)
Dry Bowser riding Dragonetti/ Honeycoupe: Stats(speed=53, weight=62, acceleration=27, handling=29, drift=56, offroad=30, turbo=62)
...
King Boo riding Aero Glider/ Jetsetter: Stats(speed=69, weight=56, acceleration=21, handling=22, drift=27, offroad=19, turbo=16)
Funky Kong riding Aero Glider/ Jetsetter: Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)
Bowser riding Aero Glider/ Jetsetter: Stats(speed=71, weight=61, acceleration=21, handling=17, drift=30, offroad=16, turbo=16)
(m)
Birdo riding Mach Bike: Stats(speed=55, weight=40, acceleration=24, handling=32, drift=62, offroad=30, turbo=67)
Diddy Kong riding Mach Bike: Stats(speed=55, weight=37, acceleration=27, handling=32, drift=65, offroad=27, turbo=67)
Medium Mii riding Mach Bike: Stats(speed=58, weight=40, acceleration=24, handling=32, drift=62, offroad=30, turbo=65)
...
Peach riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=48, acceleration=32, handling=24, drift=43, offroad=21, turbo=24)
Mario riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=54, acceleration=29, handling=26, drift=40, offroad=21, turbo=24)
Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
(s)
Dry Bones riding Bullet Bike: Stats(speed=53, weight=24, acceleration=35, handling=35, drift=70, offroad=29, turbo=73)
Koopa Troopa riding Bullet Bike: Stats(speed=53, weight=24, acceleration=32, handling=38, drift=67, offroad=29, turbo=73)
Small Mii riding Bullet Bike: Stats(speed=56, weight=27, acceleration=32, handling=35, drift=70, offroad=29, turbo=70)
...
Baby Mario riding Blue Falcon: Stats(speed=60, weight=37, acceleration=35, handling=35, drift=43, offroad=24, turbo=29)
Baby Peach riding Blue Falcon: Stats(speed=63, weight=35, acceleration=38, handling=32, drift=43, offroad=24, turbo=29)
Baby Luigi riding Blue Falcon: Stats(speed=65, weight=37, acceleration=35, handling=29, drift=43, offroad=24, turbo=29)
Так как не много персонажей и велосипедов, вы могли бы, вероятно, переборщить его. То есть, проверьте каждого персонажа с каждым доступным транспортным средством, которое они могут использовать, и найдите самый высокий.