替换符合lambda条件的列表项

Nak*_*kle 5 python lambda list

我已经被困在我的代码的一行上了一段时间,我不知道为什么它会像它一样返回.

guess = 'a'
word = ['a', 'b', 'c']
board = ['_', '_', '_']
board = list(map(lambda x: guess if word[board.index(x)] == guess else x, board))

print(board)
Run Code Online (Sandbox Code Playgroud)

这回来了

['a', 'a', 'a']
Run Code Online (Sandbox Code Playgroud)

而我的目标是回归

['a', '_', '_']
Run Code Online (Sandbox Code Playgroud)

我以前的解决方案是循环遍历列表,索引的值越来越大,并根据猜测单独检查单词中的每个条目,并在同一索引处替换单板列表,但我觉得有一个更简洁的pythonic方式使用lambda,我只是不能得到它.

Aja*_*234 5

您可以使用列表理解:

guess = 'a'

word = ['a', 'b', 'c']

new_word = [i if i == guess else "_" for i in word]
Run Code Online (Sandbox Code Playgroud)

这会给你:

["a", "_", "_"]
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案忽略了整个董事会方面他没有提到它,但可能的最终目标是再次"猜测"并更新董事会的状态.您的解决方案不适用于此.它假设棋盘总是由一个角色组成. (2认同)

MSe*_*ert 5

问题是返回第一个匹配的索引的list.index方法:

list.index(x[, start[, end]])

值为x第一个项的列表中返回从零开始的索引.ValueError如果没有这样的项目,则提高a .[...]

如果您对解决方案也感兴趣:您可以简单地迭代两者word并且board:

guess = 'a'
word = ['a', 'b', 'c']
board = ['_', '_', '_']
board = list(map(lambda x, y: guess if x == guess else y, word, board))  # 3 parameters!

print(board)  # ['a', '_', '_']
Run Code Online (Sandbox Code Playgroud)

鉴于你想要"替换",你也可以使用普通的for-loop.这样您就可以避免一直创建和丢弃列表:

for idx, char in enumerate(word):
    if char == guess:
        board[idx] = char
Run Code Online (Sandbox Code Playgroud)