如何防止嵌套列表中的元素出现多次?

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