2017-12-06 5 views
-4

私はゼロを特定の奇数に昇順に置き換えようとしています。例えば:私はリスト[[0]、[0、0]、[0,0,0]など]のこのリストを持つ生のものを持っており、これを取得する必要があります:[[1]、[3,5 ]、[7,9,11]、[13,15,17,19]など]数字とセルをリンクする方法は? python 3(私はzip関数と別の方法を試しました)

def x(n): 
    obj = iter(list(range(1, 100, 2))) 
    odds = list(range(1, 100, 2)) 
    a =[y*[0] for y,x in enumerate(odds,1)] 
    for i in range(0,50): 
     a[i] = next(obj) 
    return odds 
print(x(10)) 

小さなヒントが必要です。どのようにこのコードを続行/修正しますか。

+0

私はここで任意の '[[0]、[0、0]、[0,0,0]と等]'入力が表示されません。 ..何について質問がありますか? – Julien

答えて

1

をlist comprehensionと呼ばれる。関数はリスト内包表記を使用して初期リストを作成し、最後の行はそれを使用して最終回答を作成します。もう少し簡単な例を追加します。

def xx(ll): 
    obj = iter(range(1, 1000, 2)) 
    for chunk in ll: 
     for i in range(len(chunk)): 
      if chunk[i] is 0: 
       chunk[i] = next(obj) 
    return ll 

def zero(n): 
    return [[0] * i for i in range(1, n)] 

zeros = zero(5) 
print(zeros) 
result = xx(zeros) 
print(result) 

そして出力:

[[0], [0, 0], [0, 0, 0], [0, 0, 0, 0]] 
[[1], [3, 5], [7, 9, 11], [13, 15, 17, 19]] 

ここでも、xx()関数は奇数を引き出すために、イテレータを使用しています。ここ

は簡単な解決策です。私はそれがあなたが見たいものの一部であると推測しているので、それをそのようにしました。そこから、私はマスターリストの各チャンクを辿ります。リストはもう少し小さいリストです。小さなリストごとに、値がゼロかどうかをチェックし、値が0の場合はイテレータオブジェクトの次の値に置き換えます。最後に、更新されたマスターリストが返されます。

この実装に関する素晴らしい点の1つは、入力されたマスターリストにゼロだけが含まれていない場合、このコードはゼロで置き換えられます。これは、あなたの入力データがどのようにシンプルに設定されているかがわかるまで。

+0

ありがとうございました! –

0

あなたは、このような単純なもの行うことができます:

zeroes = [[0], [0, 0], [0,0,0], [0,0,0,0]] 

count = 1 
for lst in zeroes: 
    for i in range(len(lst)): 
     lst[i] = count 
     count += 2 

print(zeroes) 
# [[1], [3, 5], [7, 9, 11], [13, 15, 17, 19]] 

だけ2に増加するカウンタをオフに基づいて奇数とゼロのネストされたリストを更新。

あなたはイテレータとitertools機能を使用しています。このような、より複雑なものも行うことができます:あなたはイテレータを使用しようとしているので、これは何かを使用しています

#this gives you your zero lists... 
def zero(n): 
    return [[0] * i for i in range(1, n)] 

z = zero(5) # this gives the same input as what you show in your example 

x = iter(range(1, 1000, 2)) # you should calc and be sure 1000 is big enough 
replacement = [[next(x) for i in chunk if i is 0] for chunk in z] 

...

import itertools 

def x(n): 
    # get the zeroes sublists 
    zeroes = [i * [0] for i in range(1, n+1)] 

    # get the length of the flattened list above 
    odd_len = len(list(itertools.chain.from_iterable(zeroes))) 

    # get the odd numbers 
    odd_numbers = [i for i in range(1, odd_len * 2, 2)] 

    # check they are the same length 
    assert(len(odd_numbers) == odd_len) 

    # convert to iterator 
    odd_numbers = iter(odd_numbers) 

    # loop over the zeroes 
    for lst in zeroes: 

     for i in range(len(lst)): 

      # update the zeroes with the odd numbers 
      lst[i] = next(odd_numbers) 

    return zeroes 

>>> print(x(4)) 
[[1], [3, 5], [7, 9, 11], [13, 15, 17, 19]] 

>>> print(x(10)) 
[[1], [3, 5], [7, 9, 11], [13, 15, 17, 19], [21, 23, 25, 27, 29], [31, 33, 35, 37, 39, 41], [43, 45, 47, 49, 51, 53, 55], [57, 59, 61, 63, 65, 67, 69, 71], [73, 75, 77, 79, 81, 83, 85, 87, 89], [91, 93, 95, 97, 99, 101, 103, 105, 107, 109]] 
+0

このシンプルなアプローチは非常に面白いです:)ありがとう。 –

0

ここでは、任意の奥行きリストリストのリストで動作するソリューションです。それはitertools.count、リストの理解と再帰を使用します。

import random 
import itertools 

def create(minchld = 2, mxchld = 4, p0 = 0.5, mxdpth = 4): 
    return [0 if mxdpth==0 or random.random() < p0 else create(minchld, mxchld, p0, mxdpth-1) 
      for i in range(random.randint(minchld, mxchld))] 

def fill(zeros): 
    odd = itertools.count(start=1, step=2) 
    def replace(zeros): 
     return [next(odd) if i==0 else replace(i) for i in zeros] 
    return replace(zeros) 

zeros = create() 
print(zeros) 
print(fill(zeros)) 

サンプルの実行:

# [[0, 0, [0, 0, 0]], 0, [0, 0, [[0, 0, [0, 0]], [[0, 0, 0], 0, 0], 0, 0], 0], 0] 
# [[1, 3, [5, 7, 9]], 11, [13, 15, [[17, 19, [21, 23]], [[25, 27, 29], 31, 33], 35, 37], 39], 41] 

# [0, [0, [0, [0, 0]]]] 
# [1, [3, [5, [7, 9]]]] 

# [[[0, [0, [0, 0]], [[0, 0, 0, 0], 0], [[0, 0], 0]], 0, 0, [[[0, 0, 0], [0, 0, 0, 0], [0, 0, 0], [0, 0, 0]], 0, 0]], 0] 
# [[[1, [3, [5, 7]], [[9, 11, 13, 15], 17], [[19, 21], 23]], 25, 27, [[[29, 31, 33], [35, 37, 39, 41], [43, 45, 47], [49, 51, 53]], 55, 57]], 59] 
関連する問題