2017-06-06 13 views
5

Tôi đã bị kẹt trên một dòng mã của tôi trong một thời gian và tôi không biết tại sao nó lại trả về.thay thế các mục danh sách phù hợp với điều kiện trong 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) 

này trả

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

Trong khi mục tiêu của tôi là sự trở lại của

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

giải pháp trước đây của tôi là để lặp qua danh sách với giá trị gia tăng cho các chỉ số, và để riêng kiểm tra từng mục trong từ để đoán, và để thay thế danh sách hội đồng quản trị tại cùng một chỉ mục, nhưng tôi cảm thấy rằng có một cách súc tích và ngắn gọn hơn bằng cách sử dụng lambda, tôi không thể hoàn toàn hiểu rồi.

+3

vấn đề là tất cả 'x' của bạn sẽ là' _' và 'board.index (x)' luôn trả về '0' vì đó là dấu gạch dưới đầu tiên trong bảng của bạn. Bạn sẽ cần sử dụng 'liệt kê (bảng)' để có thể lặp qua các giá trị và chỉ mục một cách độc lập – Hamms

+4

Tôi cũng khuyên bạn nên sử dụng một danh sách hiểu chứ không phải là bản đồ; nó dễ dàng hơn, dễ đọc hơn và phù hợp hơn với trường hợp sử dụng của bạn – Hamms

Trả lời

5

Vấn đề là list.index method trả về chỉ số của kết quả phù hợp đầu tiên:

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

Return zero-based index trong danh sách các mục đầu tiên có giá trị là x. Tăng số ValueError nếu không có mục nào như vậy. [...]

Nếu bạn cũng đang quan tâm đến một giải pháp: Bạn chỉ có thể lặp trên cả 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', '_', '_'] 

Cho rằng bạn muốn "thay thế", bạn cũng có thể sử dụng một bình thường for-vòng lặp. Bằng cách đó bạn sẽ tránh tạo ra và loại bỏ liệt kê tất cả các thời gian:

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

Bạn có thể sử dụng danh sách hiểu:

guess = 'a' 

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

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

này sẽ cung cấp cho bạn:

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

Giải pháp này bỏ qua toàn bộ khía cạnh của bảng. Ông không đề cập đến nó nhưng mục tiêu cuối cùng có thể là "đoán" lại và cập nhật trạng thái của bảng.Giải pháp của bạn sẽ không hoạt động cho điều đó. Nó giả định hội đồng quản trị luôn được tạo thành một nhân vật duy nhất. – clockwatcher

3

Có lẽ bạn đang tìm kiếm cái gì như thế này:

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

Bạn có thể sử dụng list hiểu như đã đề cập trong các câu trả lời, nhưng trong mã của bạn board sẽ luôn luôn thiết lập lại với tất cả các dự đoán. Tôi đoán bạn muốn theo dõi các dự đoán cho đến khi tất cả các chữ cái được đoán (hoặc cho đến khi số đoán) để loop của bạn nên có một tạm thời list và sau đó loop qua bảng để thêm các dự đoán mới (nếu có) như:

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!') 
Các vấn đề liên quan