如何在python/itertools中计算公式1比赛的所有组合

2024-06-11 16:51:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想制作一个锦标赛计算器/模拟器,帮助找出车手如何赢得锦标赛的不同组合

在四处挖掘之后,我想我需要使用itertools。以下是我到目前为止的情况。问题是,目前它正在为每个驾驶员生成每个位置,而我只需要它为每个组合为每个驾驶员分配一个位置

def Sim():
    drivers = ["Lewis Hamilton","Valteri Bottas","Max Verstappen","Sergio Perez","Lando Norris","Daniel Riccardo","Carlos Sainz","Charles Lecerc","Pierre Gasly","Yuki Tsunoda","Kimi Raikonnen","Antonio Giovnazzi","Sebastian Vettel","Lance Stroll","Fernando Alonso","Estaban Ocon","George Russel","Nicholas Latifi","Mick Schumacher","Nikita Mazepin"]
    pos = ["20", "19", "18", "17", "16", "15", "14", "13", "12", "11", "10", "9", "8", "7", "6", "5", "4", "3", "2", "1"]
    c = list(itertools.product(drivers, pos))
    print(c)

Tags: posdef情况sim模拟器计算器itertools锦标赛
2条回答

我不知道我是否理解正确,但我认为您可能希望为驱动程序生成排列;如果我错了,请纠正我,但例如,对于3个驱动程序A、B和C,它将是:

[(A, 1), (B, 2), (C, 3)]
[(A, 1), (B, 3), (C, 2)]
[(A, 2), (B, 1), (C, 3)]
[(A, 2), (B, 3), (C, 1)]
[(A, 3), (B, 1), (C, 2)]
[(A, 3), (B, 2), (C, 1)]

然后注意,在您的案例20! ~ 2 * 10^18中,置换的数量是n!

所有可能的排列数量都很大,但您可以通过以下方式获得:

import itertools
drivers = ["Lewis Hamilton","Valteri Bottas","Max Verstappen","Sergio Perez","Lando Norris","Daniel Riccardo","Carlos Sainz","Charles Lecerc","Pierre Gasly","Yuki Tsunoda","Kimi Raikonnen","Antonio Giovnazzi","Sebastian Vettel","Lance Stroll","Fernando Alonso","Estaban Ocon","George Russel","Nicholas Latifi","Mick Schumacher","Nikita Mazepin"]
pos = list(range(len(drivers)))

p = itertools.permutations(pos)

for i in range(10):
    x = list(zip(drivers, next(iter(p))))
    print(x)

你看到的是排列(不是产品)。但20辆车可以在2432902008176640000个位置排列中完成。每个获胜的车手有121645100408832000人

即使您使用了正确的函数(排列),您也无法在超级计算机上处理它们,更不用说将它们存储在列表中了

drivers = ["Lewis Hamilton","Valteri Bottas","Max Verstappen","Sergio Perez","Lando Norris","Daniel Riccardo","Carlos Sainz","Charles Lecerc","Pierre Gasly","Yuki Tsunoda","Kimi Raikonnen","Antonio Giovnazzi","Sebastian Vettel","Lance Stroll","Fernando Alonso","Estaban Ocon","George Russel","Nicholas Latifi","Mick Schumacher","Nikita Mazepin"]

from itertools import permutations

for raceResult in permutations(drivers):
    print(*(f"{p}:{d}" for p,d in enumerate(raceResult[:3],1)),end=" ... ")
    print(*(f"{p}:{d}" for p,d in enumerate(raceResult[18:],18)))

1:Lewis Hamilton 2:Valteri Bottas 3:Max Verstappen ... 18:Mick Schumacher 19:Nikita Mazepin
1:Lewis Hamilton 2:Valteri Bottas 3:Max Verstappen ... 18:Nikita Mazepin 19:Mick Schumacher
1:Lewis Hamilton 2:Valteri Bottas 3:Max Verstappen ... 18:Nicholas Latifi 19:Nikita Mazepin
1:Lewis Hamilton 2:Valteri Bottas 3:Max Verstappen ... 18:Nikita Mazepin 19:Nicholas Latifi
1:Lewis Hamilton 2:Valteri Bottas 3:Max Verstappen ... 18:Nicholas Latifi 19:Mick Schumacher
...

更容易管理的是只查看前3个的排列(对于您的19个驱动程序,只有6840个):

for raceResult in permutations(drivers,3):
    print(*(f"{p}:{d}" for p,d in enumerate(raceResult,1)))

1:Lewis Hamilton 2:Valteri Bottas 3:Max Verstappen
1:Lewis Hamilton 2:Valteri Bottas 3:Sergio Perez
1:Lewis Hamilton 2:Valteri Bottas 3:Lando Norris
1:Lewis Hamilton 2:Valteri Bottas 3:Daniel Riccardo
1:Lewis Hamilton 2:Valteri Bottas 3:Carlos Sainz
1:Lewis Hamilton 2:Valteri Bottas 3:Charles Lecerc
1:Lewis Hamilton 2:Valteri Bottas 3:Pierre Gasly
1:Lewis Hamilton 2:Valteri Bottas 3:Yuki Tsunoda
1:Lewis Hamilton 2:Valteri Bottas 3:Kimi Raikonnen
1:Lewis Hamilton 2:Valteri Bottas 3:Antonio Giovnazzi
...

相关问题 更多 >