如何解决试图找出从列表中随机选择一个项目的逻辑,使用返回值从另一个列表中随机选择一个项目 Python
我对 Python 和编码还很陌生,我正在尝试理解如何做某事的逻辑。我正在创建一个脚本来从控制台(列表)中随机选择一个游戏,并从所述控制台中随机选择一个游戏(列表)。例如,我想从三个或四个控制台中随机选择,一旦选择了一个控制台,就从该控制台中随机选择一个游戏。我曾尝试制作一个我不知道该怎么做的函数,因为我对编程非常陌生。
import random
# List of Console one owns
console = [ "nes","Snes" ]
# A list of each game one would want to play for each console
nes = [ "Contra","Metroid","Mega Man","Mega Man 2","Mega Man 3","Mega Man 4","Mega Man 5","Mega Man 6","Ninja Gaiden","Ninja Gaiden 2","Strider" ]
Snes = [ "Act Raiser","Chrono Trigger ","F-Zero","Final Fantasy 2|4"," Final Fantasy 3|6","The legend of Zelda: A Link to the Past","Super Mario RPG","Super Metroid"]
# To be added in later
# List of Genre one might wan to play
genre = ["Action","Action-Adventure","RPG","Sports"]
#Fucntion to select a random game from all games Available"
S_console = random.choices(console)
S_game = random.choices(S_console)
解决方法
首先,欢迎!我喜欢你的问题。您的标题可能有点过长,但您以一种可以理解的方式提出了您的问题,并提供了您自己的解决方法。到目前为止做得很好:)
那么,让我给你一些反馈。
- 您只想选择一个项目,因此
random.choice
可能比random.choices
更适合 - 您实际上并未对
NES
和SNES
变量执行任何操作。为了最终获得真正的游戏,您需要真正阅读这些内容。
我认为您在代码中犯的最大错误是您假设字符串 "NES"
和变量 NES
以某种方式连接。它们不是,一个是内容为 "NES"
的字符串,另一个是名为 NES
的变量。那些彼此没有任何关系。所以你的第二个 random.choices
不起作用,因为它实际上不是迭代变量 NES
,而是迭代字符串 "NES"
。
我进一步怀疑这就是您选择 random.choices()
而不是 random.choice()
的原因,因为 random.choice()
给您的错误消息是您不能使用字符串类型的变量作为 { {1}}。所以你实际上通过使用 choice()
而不是修复它来隐藏真正的问题。
在我的脑海里,我看到了两种方法可以将主机的选择与主机游戏的实际列表联系起来:
- 使用
choices
语句手动映射 - 重构您的数据结构,以更好地表示这些列表是分层的。
使用 if 语句:
if
具有更好的数据结构:
import random
# List of Console one owns
console = [ "NES","SNES" ]
# A list of each game one would want to play for each console
NES = [ "Contra","Metroid","Mega Man","Mega Man 2","Mega Man 3","Mega Man 4","Mega Man 5","Mega Man 6","Ninja Gaiden","Ninja Gaiden 2","Strider" ]
SNES = [ "Act Raiser","Chrono Trigger ","F-Zero","Final Fantasy 2|4"," Final Fantasy 3|6","The legend of Zelda: A Link to the Past","Super Mario RPG","Super Metroid"]
# To be added in later
# List of Genre one might wan to play
genre = ["Action","Action-Adventure","RPG","Sports"]
#Function to select a random game from all games available
S_console = random.choice(console)
print(f"Console: {S_console}")
S_game = ""
if S_console == "NES":
S_game = random.choice(NES)
elif S_console == "SNES":
S_game = random.choice(SNES)
print(f"Game: {S_game}")
编辑:
在意识到您创建 import random
# Dictionary of consoles one owns,together with games for that console
consoles = {
"NES": ["Contra","Strider"],"SNES": ["Act Raiser","Super Metroid"]
}
# Function to select a random game from all games available
S_console = random.choice(list(consoles.keys()))
S_game = random.choice(consoles[S_console])
print(f"Console: {S_console}")
print(f"Game: {S_game}")
数组字符串的元素的唯一原因是否则您会遇到错误,以下是您可能打算编写的内容:
console
如果您设置 import random
# A list of each game one would want to play for each console
NES = [ "Contra","Super Metroid"]
# List of Console one owns
console = [ NES,SNES ]
# To be added in later
# List of Genre one might wan to play
genre = ["Action","Sports"]
#Fucntion to select a random game from all games Available"
S_console = random.choice(console)
S_game = random.choice(S_console)
和 NES
before SNES
,您可以将它们用作数组的成员。
既然您已经使用过 choices
,我假设您对列表的简单抽样很清楚。注意,有替换和无替换的选择有一个重要的区别,Python 有两种功能。
在您的情况下,您不仅需要从列表中随机选择一个游戏(技术术语是人口),而且您有多个人口(每个控制台一个)并且还必须选择人口随机。
您随机选择控制台名称,但在 Python 中没有一种简单的方法可以说“获取名称与此字符串匹配的变量”。有一种方法可以做到这一点,但通常以这样的方式编写程序更简单,如果变量都被重命名而不改变任何常量,它仍然可以工作。
简单的解决方案是列表列表。我们可以像这样修改您的代码:
# Each console's population
NES = [ "Contra","Super Metroid"]
# Make list of populations
allpops = [NES,SNES]
# Pick random pop
thispop = random.choice(u)
# Pick random game from this pop
S_game = random.choices(thispop)
这是定义列表列表的另一种等效方式:
# Make list of populations
allpops = [
[ "Contra","Strider" ],[ "Act Raiser","Super Metroid"]
]
这里的问题是每个种群的名称都消失了,因为没有直接的方法将名称附加到列表的元素上。所以你无法告诉用户选择了哪个控制台,他们只知道游戏。
如果您确实关心控制台,则可以使用字典。它与列表列表的想法类似,只是每个元素现在都可以有一个键(也有重要的性能影响)。
allpops = {
"NES': [ "Contra","SNES": [ "Act Raiser","Super Metroid"]
}
# Chose random console
console = random.choice(allpops)
thispop = allpops[console]
# Choose random game
game = random.choice(thispop)
既然你也想做流派,你就必须做一些类似控制台字典到流派字典到游戏的事情,并进行 3 轮选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。