2017-05-09 7 views
0

これをビジュアライザで実行すると、2dリストの最初の要素のみが変更されます。どのようにしてリスト全体を走らせるのですか?2dリストのすべての整数を修正して偶数にする

 def make_even(xss): 
     for i in range(len(xss)): 
     for j in range(len(xss)): 
      if xss[i][j] % 2!= 0: 
       xss[i][j] += 3 
      return xss 

    xss = [[1,2,3],[],[4,5]] 
    make_even(xss) 
    print(xss) 
+1

私は、あなたのインデントを修正する必要があると思うpythonは、ループの入れ子を検出します。 – IQV

答えて

0

だから、最初のオフ、あなたのコード内であなたのインデントを修正する必要があります。

def make_even(xss): 
    for i in range(len(xss)): 
     for j in range(len(xss)): 
      if xss[i][j] % 2!= 0: 
       xss[i][j] += 3 
    return xss 

両方あなたのループがlen(xss)を使用するためしかし、彼らは3つのリスト3つの要素を持つ各の配列を期待しています。あなたは、各リストは、要素の変数番号を持ちたいと思います場合は、代わりにこれを行う必要があります。

def make_even(xss): 
    for i in range(len(xss)): 
     for j in range(len(xss[i])): 
      if xss[i][j] % 2!= 0: 
       xss[i][j] += 3 
    return xss 

返す:[[4, 2, 6], [], [4, 8]]

をしかし、私はなるだろう2つの明らかな変化があります。

  1. ifステートメントはif xss[i][j] % 2 == 1である必要があります。
  2. 1を追加することによっても数値を作ることができます(3つの仕様が必要な場合は問題ありません)。

また、これは、(任意の行は動作します)シングルラインで完全になんとかです:

# List comprehensions only 
xss = [[(x + 3 if x % 2 == 1 else x) for x in row] for row in xss] 
# map and lamdbas (returns lists) 
xss = list(map(lambda row: list(map((lambda x: x + 3 if x % 2 == 1 else x),row)), xss)) 
# map and lamdbas (returns iterables) 
xss = map(lambda row: map((lambda x: x + 3 if x % 2 == 1 else x),row), xss) 

個人的に、私はリストの内包表記は読みするのが最も簡単だと思いますが。

関連する問題