替换符合lambda条件的列表项

时间:2017-06-06 00:24:55

标签: python list lambda

我的代码已经停留了一段时间了,我不知道它为什么会像它一样返回。

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

print(board)

返回

['a', 'a', 'a']

我的目标是回归

['a', '_', '_']

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

4 个答案:

答案 0 :(得分:5)

您可以使用列表理解:

guess = 'a'

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

new_word = [i if i == guess else "_" for i in word]

这会给你:

["a", "_", "_"]

答案 1 :(得分:5)

问题是list.index method会返回第一场比赛的索引

  

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

     

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

如果您对解决方案也感兴趣:您可以简单地迭代wordboard

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', '_', '_']

鉴于你想要"替换"你也可以使用正常的for - 循环。这样你就可以避免一直创建和丢弃列表:

for idx, char in enumerate(word):
    if char == guess:
        board[idx] = char

答案 2 :(得分:3)

你可能正在寻找这样的东西:

board=map(lambda x: x[1] if x[1] == guess else board[x[0]], enumerate(word))

答案 3 :(得分:0)

您可以使用答案中提到的list理解,但在您的代码board中,每次猜测都会重置loop。我猜你想要跟踪猜测,直到所有字母都被猜到(或直到猜测次数),所以你的list应该有一个临时的loop,然后word = ['a', 'b', 'c'] board = ['_', '_', '_'] tries = 0 while tries != 3: guess = raw_input("Enter a guess: ") tmp = [x if x == guess else '_' for x in word] for i in xrange(len(board)): if board[i] == '_': try: board[i] = tmp[i] except IndexError: pass print(board) if '_' not in board: print('Solved!') break tries += 1 if tries == 3: print('Not solved!') 通过董事会来添加新的猜测(如果找到),如:

H2OKMeansEstimator