首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字典中选择随机值,然后排序

从字典中选择随机值,然后排序
EN

Stack Overflow用户
提问于 2018-01-19 14:40:58
回答 1查看 88关注 0票数 0

我正试图为COD WW2做一个随机类生成器,我几乎完成了,但我有一个问题。我试图选择随机得分(在其中我成功),但当我的程序打印的分数,他们不是从最便宜到最昂贵的。我知道通常情况也不是这样,但我希望有不同的情况。

所以我一直在想,我认为字典是关键,但我是Python的初学者,我以前从未真正使用过字典。

这是我的得分单:

代码语言:javascript
复制
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"]

这是我随机选择的东西:

代码语言:javascript
复制
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)

所以从理想上说,我希望在从最便宜到最贵的印刷时,我想订购记分卡。谢谢你的回答。

编辑:

我制作了一本字典(我希望我做的是正确的),其中包含了记分卡的价格:

代码语言:javascript
复制
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}

所以要说清楚:当我选择三个随机的记分记录时,它会打印一些类似“莫洛托夫鸡尾酒”,“反侦察飞机”,“侦察飞机”之类的东西。这不是:“莫洛托夫鸡尾酒”、“侦察飞机”、“反侦察飞机”,这是按价格订购的。那我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-19 15:35:45

有许多可能的方法可以这样做,但本质上您想:

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

这里有一个解决方案:

代码语言:javascript
复制
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返回键x的值的函数”。通过使用这个函数作为key进行排序,我们根据每个项目的价格进行排序。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48343525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档