2017-02-07 15 views
0

私は-を印刷する" "のすべてのインスタンスを変異させるしようとしています:私は、単に新しい行にリスト内のリストを表示する関数を作ることによって開始しました:(のpython 3)forループせずにリスト内のリストを変異

def print_board(b): 
    print("\n".join(map(lambda x:"".join(map(str, x)),b))) 

EX:

>>> print_board([[1,2,3],[2,3,4,5],[2,3,4]] 
123 
2345 
234 

それから" "-にリストにあった各インスタンスを変異させるために、この類似の方法を使用しようとした:

def is_empty(b0): 
    if b0 == " ": 
     return "-" 
    else: 
     return b0 

def empty_space(b): 
    list(map(lambda x: list(map(is_empty, x)), b))#empty_space just mutates b 

def check(b): 
    _board = empty_space(b) 
    return print_board(_board) #check just prints the mutated list b 

と私は例えばこれを行うにはcheck(b)を望んでいたのでしょう:

>>> check([[" ",3,4],[5,6,3],[" ", " ", " "]]) 
-34 
563 
--- 

しかし、私はエラーを取得しています。マップとラムダの代わりに再帰を使用しても構いませんが、これらの関数のforループは使いたくありません。

+1

'empty_space'はリストを返していません。また、 'return print_board(_board)'は 'None'を返すでしょう。あなたは単にそれを省略して' print_board(_board) 'を実行するだけです。 –

+1

私は 'empty_space'関数も参照しています。作成しているリストを返さないので、' None'が返されます。私たちはそれに着いている間、あなたが得ているエラーを指定し、Pythonが提供するトレースバックを投稿してください。 –

+0

ああ私はそれが正しく変異されたことを確認するために別の定義を作った理由は何も返さないために空のスペースが必要です – pewnienewbie

答えて

2

私は考えることができる唯一のソリューションを明示的使用aのをしません。 -loopはあなたが持っている参照に新しいリストをコピーすることです:

def empty_space(b): 
    b[:] = map(lambda x: list(map(is_empty, x)), b) 

これは実際にempty_spaceに渡された参照bを、マッパーによって生成された値に変更します。右側は任意の反復可能なので、listの呼び出しは追加的に不要です。

またあることをcheckを変更する必要があります。あなたがどんな値を返す取得されていませんので、

def check(b): 
    empty_space(b) 
    print_board(b) 

は今、これは必要に応じて実行します。

>>> check([[" ",3,4],[5,6,3],[" ", " ", " "]]) 
-34 
563 
--- 

b[:]ない最後のループ(それがなければならない)、私は本当に見ていないよあなたがforループを排除する必要性を感じ、なぜ私はあなたを推測しますあなたの理由が必要です。

+0

ありがとう!私はチェックを変更するが、なぜb [:]を置くとbと同じものなのだろうか?私はあなたの説明をすばやく理解できませんでしたが、変数ではなくb [:]を参照するようになりました。 – pewnienewbie

+0

@pewnienewbie 'b [:]'は、 'bのすべての値を' map'と 'is_empty'で作成されたリストの右側の値に置き換えます。 'b'は変更可能な参照(リスト)なので、置換は後で' check'に反映されます。 –

+0

わかりました。それは実際には本当に賢い修正です!再度ありがとう – pewnienewbie

1

2Dリストのみを使用する場合は、再帰が必要ありません。あなたが書いたのは、for loopを使用したくないと書きましたが、mapは偽装したfor loopです。また、リストを変更することもありません。

だから、あなたが必要とするすべては、次のとおりです。

def check(rows): 
    for row in rows: 
     print "".join([str(x) for x in row]).replace(' ','-') 

check([[" ",3,4],[5,6,3],[" ", " ", " "]]) 
# -34 
# 563 
# --- 

あなたが本当にmapの使用したい場合:

def replace_char(char): 
    return str(char).replace(' ', '-') 

def replace_row(row): 
    return "".join(map(replace_char, row)) 

def check(rows): 
    print "\n".join(map(replace_row, rows)) 

check([[" ",3,4],[5,6,3],[" ", " ", " "]]) 
# -34 
# 563 
# --- 
関連する問題