lambda

2017-06-06 35 views
5

durumuna uyan liste öğelerinin değiştirilmesi bir süredir kod satırımın üzerine sıkışmış durumdayım ve neden olduğu gibi geri dönme konusunda bir kayıp yapıyorum. amacım tek tek içinlambda

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

Benim önceki çözümün bir dönüş olduğunu endeksi için artan değerle listesinde döngü oldu, ve Oysa

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

print(board) 

Bu

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

döndürür tahmin edilene karşı her girişi kontrol edin ve aynı indekste tahta listesini değiştirmek için, ama ben lambda kullanarak daha özlü ve pythonic bir şekilde olduğunu hissediyorum, ben sadece oldukça yapamam anla.

+3

problemi, tüm 'x'lerin' _' olacak ve 'board.index (x)' her zaman, '0' için geri dönecektir, çünkü bu, tahtadaki ilk alt çizgi olduğundan. Değerleri ve indeksleri bağımsız olarak – Hamms

+4

üzerinden yineleyebilmek için 'numaralandırma (tahta) 'kullanmanız gerekecek; ayrıca bir haritadan ziyade liste kavramalarını kullanmanızı tavsiye ederim; Bu daha kolay, daha okunaklı ve kullanım durumunuza daha uygun – Hamms

cevap

5

sorundur list.index method, dizininin ilk değerini döndürür: değeri x olduğunu ilk öğenin listede

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

İade sıfır tabanlı dizini. Böyle bir öğe yoksa ValueError'u yükseltir. [...]

aynı zamanda bir solüsyon ilgileniyorsanız:

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

sen de kullanabilirsiniz "yerine" istediğiniz göz önüne alındığında: Sadece word ikisi üzerinde ve board yineleme normal bir for -loop. Eğer listeler her zaman oluşturma ve atmadan önleyeceğini Bu şekilde: cevapları belirtildiği gibi

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

Sen liste anlama kullanabilirsiniz:

guess = 'a' 

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

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

Bu size verecektir:

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

Bu çözüm tüm yönetimsel yönü göz ardı eder O bahsetmez ama olası bir nihai hedef tekrar "tahmin" ve yönetim kurulu durumunu güncellemek olacaktır.Çözümünüz bunun için çalışmaz. Tahtanın her zaman tek bir karakter oluşturduğunu varsayar. – clockwatcher

3

Muhtemelen böyle bir şey arıyorsanız:

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

Sen list anlama kullanabilirsiniz, ancak kodunuzda board zaman her tahminle sıfırlanır. Tahminimce tüm harfleri tahmin edene kadar tahminleri (veya tahminlerin sayısı kadar) tutmak istediğinizi tahmin ediyorum, böylece loop sizin için list ve loop (tahmin edildiyse) yeni tahminleri eklemek için geçici olarak

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!')