如何防止嵌套列表中的元素出现多次?
How do I prevent elements in a nested list to appear more than once?
我正在尝试创建一个带有记分牌的简单猜数游戏。但是,我发现很难不为经常性玩家创建新玩家(名称)。
我可以知道我的编码有什么问题吗?或者我应该做一些不同的事情,这样一个经常出现的玩家的名字不会在列表中出现多次吗?
lst=[["Player 1",0],['Player 2',0],['Player 3',0],['Player 4',0],['Player 5',0]]
#increase score
def inc(I):
if lst[0][0]== playername:
lst[0][1]+=i
elif lst[1][0]==playername:
lst[1][1]+=i
elif lst[2][0]==playername:
lst[2][1]+=i
elif lst[3][0]==playername:
lst[3][1]+=i
elif lst[4][0]==playername:
lst[4][1]+=i
return
secret = 0
guess= -1
play="yes"
#name for player
playername=str(input("Player B, what is your name?"))
if lst[0][0]=="Player 1":
if lst[0][0]!= playername:
lst[0][0]=playername
elif lst[1][0]== "Player 2":
if lst[1][0]!= playername:
lst[1][0]=playername
elif lst[2][0]=="Player 3":
if lst[2][0]!= playername:
lst[2][0]=playername
elif lst[3][0]=="Player 4":
if lst[3][0]!= playername:
lst[3][0]=playername
elif lst[4][0]=="Player 5":
if lst[4][0]!= playername:
lst[4][0]=playername
while secret>100 or secret <1:
secret = float(input("Player A: Please input a secret number between 1-100: "))
while(guess!=secret):
guess = float(input("Player B: Please guess again: "))
guess1(secret, guess)
tries+=1
if tries==4:
break
这是输出:
[['Sherlyn', 2],
['sherlyn', 1],
['Sherlyn', 0],
['Player 4', 0],
['Player 5', 0]]
我不认为你的代码本身有什么问题,只是 'same name' 的代码定义与你的不同。
从设计的角度来看,我会为此使用 python 的词典:https://docs.python.org/3/tutorial/datastructures.html#dictionaries
但是,您可能还没有学过它们,或者只是想练习数组,这些都是使用数组的好理由。
然后,对于名称本身,您正在进行此比较 lst[0][0]=="Player 1"
。这够了吗?当玩家回来时会发生什么? (它创建了一个新名称)。
相反,您应该首先检查名称 (playername
) 是否已经在您现有的列表中(此外,最好在循环中执行此操作而不是对索引 0-4 进行硬编码),并且然后检查该名称是否是您要更新的默认值之一。
最后,我可能会同时存储 'as entered' 名称和您转换为大写或小写(例如 https://www.w3schools.com/python/ref_string_lower.asp)的标识符名称,以防止 Sherlyn 与 sherlyn 不同.
我认为您可以将测试玩家名称的代码更改为以下内容:
if lst[0][0] != playername and lst[1][0] != playername and lst[2][0] != playername and lst[3][0] != playername and lst[4][0] != playername:
if lst[0][0] == "Player 1":
lst[0][0] = playername
elif lst[1][0] == "Player 2":
lst[1][0] = playername
elif lst[2][0] == "Player 3":
lst[2][0] = playername
elif lst[3][0] == "Player 4":
lst[3][0] = playername
elif lst[4][0] == "Player 5":
lst[4][0] = playername
else:
# a sixth name's entered
pass # may also output a message
我正在尝试创建一个带有记分牌的简单猜数游戏。但是,我发现很难不为经常性玩家创建新玩家(名称)。 我可以知道我的编码有什么问题吗?或者我应该做一些不同的事情,这样一个经常出现的玩家的名字不会在列表中出现多次吗?
lst=[["Player 1",0],['Player 2',0],['Player 3',0],['Player 4',0],['Player 5',0]]
#increase score
def inc(I):
if lst[0][0]== playername:
lst[0][1]+=i
elif lst[1][0]==playername:
lst[1][1]+=i
elif lst[2][0]==playername:
lst[2][1]+=i
elif lst[3][0]==playername:
lst[3][1]+=i
elif lst[4][0]==playername:
lst[4][1]+=i
return
secret = 0
guess= -1
play="yes"
#name for player
playername=str(input("Player B, what is your name?"))
if lst[0][0]=="Player 1":
if lst[0][0]!= playername:
lst[0][0]=playername
elif lst[1][0]== "Player 2":
if lst[1][0]!= playername:
lst[1][0]=playername
elif lst[2][0]=="Player 3":
if lst[2][0]!= playername:
lst[2][0]=playername
elif lst[3][0]=="Player 4":
if lst[3][0]!= playername:
lst[3][0]=playername
elif lst[4][0]=="Player 5":
if lst[4][0]!= playername:
lst[4][0]=playername
while secret>100 or secret <1:
secret = float(input("Player A: Please input a secret number between 1-100: "))
while(guess!=secret):
guess = float(input("Player B: Please guess again: "))
guess1(secret, guess)
tries+=1
if tries==4:
break
这是输出:
[['Sherlyn', 2],
['sherlyn', 1],
['Sherlyn', 0],
['Player 4', 0],
['Player 5', 0]]
我不认为你的代码本身有什么问题,只是 'same name' 的代码定义与你的不同。
从设计的角度来看,我会为此使用 python 的词典:https://docs.python.org/3/tutorial/datastructures.html#dictionaries
但是,您可能还没有学过它们,或者只是想练习数组,这些都是使用数组的好理由。
然后,对于名称本身,您正在进行此比较 lst[0][0]=="Player 1"
。这够了吗?当玩家回来时会发生什么? (它创建了一个新名称)。
相反,您应该首先检查名称 (playername
) 是否已经在您现有的列表中(此外,最好在循环中执行此操作而不是对索引 0-4 进行硬编码),并且然后检查该名称是否是您要更新的默认值之一。
最后,我可能会同时存储 'as entered' 名称和您转换为大写或小写(例如 https://www.w3schools.com/python/ref_string_lower.asp)的标识符名称,以防止 Sherlyn 与 sherlyn 不同.
我认为您可以将测试玩家名称的代码更改为以下内容:
if lst[0][0] != playername and lst[1][0] != playername and lst[2][0] != playername and lst[3][0] != playername and lst[4][0] != playername:
if lst[0][0] == "Player 1":
lst[0][0] = playername
elif lst[1][0] == "Player 2":
lst[1][0] = playername
elif lst[2][0] == "Player 3":
lst[2][0] = playername
elif lst[3][0] == "Player 4":
lst[3][0] = playername
elif lst[4][0] == "Player 5":
lst[4][0] = playername
else:
# a sixth name's entered
pass # may also output a message