2017-06-06 67 views
5

我一直在我的代碼行停留了一段時間,而且我爲什麼會返回,因爲它一直在虧損。替換符合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的方式,我只是不能完全 得到它。

+3

問題是你所有的'x's都是'_','board.index(x)'總是會返回'0',因爲這是你的主板中的第一個下劃線。你需要使用'enumerate(board)'來獨立遍歷值和索引 – Hamms

+4

我還建議你使用列表理解而不是地圖;它更容易,更具可讀性,更適合您的使用案例 – Hamms

回答

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 -loop。這樣,你會避免創建和丟棄列出了所有的時間:

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

您可以使用列表理解:

guess = 'a' 

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

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

這會給你:

["a", "_", "_"] 
+2

此解決方案忽略了整個電路板方面他沒有提到它,但可能的最終目標是再次「猜測」並更新電路板狀態。你的解決方案不適用於此。它假設董事會總是由一個字符組成。 – clockwatcher

3

你可能在尋找這樣的事情:

board=map(lambda x: x[1] if x[1] == guess else board[x[0]], enumerate(word)) 
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!') 
相關問題