相互比较多个变量?

时间:2019-11-03 14:12:43

标签: python

你好,我有一个随机的问题,这是我的第一篇文章,因此,如果我的礼节有误,我深感抱歉:P

我正在用python进行比赛,现在我有4辆“汽车”,每轮比赛他们都在1到10之间滚动,并且在该回合之后,我想显示类似“ carX领先”的信息的“ Y””,我对如何比较每辆车的滚动和根据哪一个最高的文本打印出特定文本有些迷惑。

感谢您的宝贵时间,

4 个答案:

答案 0 :(得分:1)

因此,基本上,您正在寻找“ argmax”实现。 这意味着您有N个值(滚动),与N个索引(汽车)相对应,并且您想查找哪个索引包含最高的值。

无论如何,由于您没有提到它,所以我将假设,如果几个值是最大值(几辆汽车具有相同的最高滚动),则其中第一个被视为获胜者。

在您的情况下,给定N = 4,您可以比较所有变量。这将为您提供4种情况(每辆获胜的汽车一个),并进行3次比较。实际上是3例,因为如果前3例未获胜,那么第四例则反抗。 每种情况如下:

if car_1 >= car_2 && car_1 > car_3 && car_1 > car_4:
    print("Car 1 is in the lead with a roll of {}".format(car_1))

这是一种可怕的方法。所以我们首先将汽车变成汽车列表

list_cars = [car_1, car_2, car_3, car_4]

您可以使用numpy中定义的已经存在的argmax函数,但让我们看看在这种简单情况下,如何不使用numpy就能做到这一点。

由于默认的“ max”函数只会为您提供值(滚动),而不是给其值的汽车,因此我们将为该函数提供list_cars的索引列表,以及为每个变量指定一个键索引,而是使用相应汽车的价值。所以:

func = lambda idx: list_cars[idx]
best_car = max(range(len(list_cars)), key = func)

此处'func'定义了一个lambda函数,该函数针对汽车列表中的每个索引返回汽车的值,而range(len(list_cars))给出从0到list_cars长度的数字列表,因此[0,1,2,3]。

结果“ best_car”将是介于0和3之间的数字,这是值最高的汽车。那你就打印

print("Car {} is in the lead with a roll of {}".format(best_car + 1, list_cars[best_car]))

我们使用best_car + 1打印汽车的编号,因为索引从0开始计数,汽车从1开始计数。

答案 1 :(得分:0)

您需要一些原始的“数据结构”来存储比赛的实际结果。 然后计算最高分,然后选择最高分的参赛者。 将其转换为python:

from random import randint
# roll will generate numbers (uniformly) between LO,HI (HI is inclusive)
LO,HI=1,10
roll=lambda : randint(LO,HI)

n=4
# generate the participiants of the race
# here the first element is the cumulative point
parti=[[0,"car"+str(i)] for i in range(n)]
print(parti)

R=10 # num of rounds
r=0
while r<R:
  r+=1
  for i in range(n):
    parti[i][0]+=roll()
  # compute the top point
  mx=max(v[0] for v in parti)
  # select the top contestants
  top=','.join([v[1] for v in parti if v[0]==mx])
  # report the state
  print('after the {0:d}. round {1:s} on the top with {2:d} points'.format(r,top,mx))

答案 2 :(得分:0)

如果我理解的很好,您希望在每轮比赛中打印出领先车的名字。您可以通过创建汽车词典来实现,其中是汽车的名称,是汽车的位置。每回合只需更新所有汽车的价值,并使用max()函数找到领先的汽车。

示例代码:

import random

number_of_rounds = 10
cars = {'Car1': 0, 'Car2':0, 'Car3':0,'Car4':0} #dictionary of cars

for round in range(1,number_of_rounds+1):
    for car in cars:
        roll_value = random.random()*9 + 1 # get the random value from 1 to 10
        roll_value = int(roll_value) #convert to int
        cars[car] = cars[car] + roll_value
    print cars
    leading_car = max(cars, key=cars.get) # find the key with highest value
    print leading_car + " is in the lead with a roll of " + str(round)

答案 3 :(得分:-1)

对不起,我的发言次数少,所以我无法发表评论,但是我有一个可能的解决方案:如果您只想检查并输出答案,则可以使用while循环。

# I don't know exactly what you're using but you define your vars up here!
carX = 2
carY = 5
carZ = 3
carN = 7

# Checks every round to see if carX is in the lead
while (carX > carY and carX > carZ and carX > carN):
    print(f"Car X is in the Lead with a roll of {carX}!")
    # Re-roll and add the values again

# Checks if carY is in the lead
while (carY > carX and carY > carZ and carX > carN):
    print(f"Car Y is in the Lead with a roll of {carY}!")
    # Re-roll and add the values again

while (carZ > carX and carZ > carY and carZ > carN):
    print(f"Car Z is in the Lead with a roll of {carZ}!")
    # Re-roll and add the values again

while (carN > carX and carN > carY and carN > carZ):
    print(f"Car Z is in the Lead with a roll of {carZ}!")
    # Re-roll and add the values again

我敢肯定,有更简单,更优雅的方法,但这只是我看到时所想到的,您可能还需要为联系和其他异常添加更多案例。