从字典中选择随机值,然后对其进行排序

时间:2018-01-19 14:40:58

标签: python random

我正在尝试为COD WW2制作一个随机类生成器,我几乎已经完成但是我遇到了一个问题。我试图选择随机分数(我成功),但是当我的程序打印得分时,他们不是从最便宜到最贵的。我知道通常情况并非如此,但我希望它有所不同。

所以我一直在思考,我认为字典是关键,但我是Python的初学者,我之前并没有真正使用过字典。

这是我的scorestreaks列表:

scorestreaks = ["Molotov Cocktail", "Recon Aircraft", "Counter Recon 
Aircraft", "Care Package", "Fighter Pilot", "Glide Bomb", "Flamethrower", 
"Mortar Strike", "Artillery Barrage", "Flak Guns", "Emergency Airdrop", 
"Fire Bombing Run", "Paratroopers", "Carpet Bombing", "Ball Turret Gunner"]

这是我随意选择的事情:

ss1 = random.choice(scorestreaks)
ss2 = random.choice(scorestreaks)
ss3 = random.choice(scorestreaks)
if ss1 == ss2 or ss1 == ss3:
    ss1 = random.choice(scorestreaks)
    if ss1 == ss2 or ss1 == ss3:
        ss1 = random.choice(scorestreaks)
elif ss2 == ss3:
    ss2 = random.choice(scorestreaks)
    if ss2 == ss3 or ss2 == ss1:
        ss2 = random.choice(scorestreaks)

print "Scorestreaks: %s, %s, %s" %(ss1, ss2, ss3)

所以理想情况下,我想在从最便宜到最贵的打印时订购得分。谢谢你的回答。

编辑:

我制作了一本字典(我希望我的方法是正确的),其中包含了得分项目的价格:

scorestreaks_prices = {"Molotov Cocktail": 300, "Recon Aircraft": 500, "Counter Recon Aircraft": 525, "Care Package": 575, "Fighter Pilot": 625, "Glide Bomb": 650, "Flamethrower": 700, "Mortar Strike": 750, "Artillery Barrage": 850, "Flak Guns": 950, "Emergency Airdrop": 1000, "Fire Bombing Run": 1050, "Paratroopers": 1250, "Carpet Bombing": 1400, "Ball Turret Gunner": 1700}

所以说清楚: 当我选择三个随机分数时,它会打印类似于"莫洛托夫鸡尾酒","反侦察飞机"," Recon Aircraft"。这取代了:"莫洛托夫鸡尾酒"," Recon Aircraft"," Counter Recon Aircraft",已按价格订购。那我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

有很多可能的方法可以做到这一点,但基本上你想:

  • 获取项目的随机子集
  • 按项目价格
  • 对该子集进行排序
  • 将项目名称作为元组,您可以在字符串中使用 格式化表达式

这是一个解决方案:

scorestreaks_prices = {"Molotov Cocktail": 300, "Recon Aircraft": 500, 
    "Counter Recon Aircraft": 525, "Care Package": 575, "Fighter Pilot": 625, 
    "Glide Bomb": 650, "Flamethrower": 700, "Mortar Strike": 750, "Artillery Barrage": 850, 
    "Flak Guns": 950, "Emergency Airdrop": 1000, "Fire Bombing Run": 1050, 
    "Paratroopers": 1250, "Carpet Bombing": 1400, "Ball Turret Gunner": 1700}

# Use a dict comprehension to create a random 3-item subset of the full dict
ssItems = {item:scorestreaks_prices[item] for item in random.sample(scorestreaks_prices.keys(), 3)}
# Sort the subset dict by the value (i.e. price); the result is a list of the keys (i.e. the item names)
ss = sorted(ssItems, key=lambda x:ssItems[x])
# Format the item list into a string
print("Scorestreaks: %s, %s, %s" %tuple(ss))

要了解其工作原理,请在Python提示符下尝试dict理解(以及稍微更容易掌握列表推导)。例如,尝试{x:len(x) for x in ['foo', 'bar', 'hello', 'z']}:你得到了什么以及为什么?

对于初学者来说,lambda x:ssItems[x]也有点模糊,但它只是意味着“一个函数从dict ssItems ”返回key x 的值。通过使用该函数作为key进行排序,我们按每个项目的价格排序。

您随机选择不同项目的方法可能仍然会返回相同的项目两次。使用random.sample可以保证这三个项目不同。

相关问题