2017-12-04 2 views
1

シラバス・エラトステネスアルゴリズムを実装する必要があります。 私はリストを持っています:
bar = [2, 3, 4, 5, 6, 7, 8, 9, 10]
私は各奇数要素を "0"で置き換える必要があります。 は、今私はコードを持っている:Python。スライスを使用して要素を置換する

while viewIndex < maxNumber: 
    bar[viewIndex] = 0 
    viewIndex += 2 

をしかし、私はスライスについて覚えています。そして、私にとっては、このような何か書くのはいいだろう。

bar[currentIndex::2] = 0 

をしかし、私はエラーを持っている:

TypeError: must assign iterable to extended slice 

はたぶん、あなたは、このタスクに美しい解決策を知っています。

+1

はこの質問を見てくださいhttps://stackoverflow.com/questions/11395057/python-set-list-range-to-a-specific-value – RoachLord

+0

あなたの場合Eatosthenesのふるいを作ることを探していますが、ここには(http://www.geeksforgeeks.org/sieve-of-eratosthenes/)があります。あなたが奇妙な指標をスキップするだけで達成しようとしていることを確信していない。シーブはあなたのためにすべてのものを世話します。 – pstatix

答えて

4

あなたはオッズの数と同じ長さの反復可能にスライスを割り当てる必要があります。でも指標のためにこれを拡張するために

bar[1::2] = [0]*(len(bar)//2) 
print(bar) 
# [2, 0, 4, 0, 6, 0, 8, 0, 10] 

、あなたが考慮リストに取る必要がありますリスト長さのモジュロ2の値を加算することにより、奇数長(上記の場合には関係ない)で、次のようになります。

bar[::2] = [0]*(len(bar)//2 + len(bar)%2) 
bar[::2] = [0]*sum(divmod(len(bar), 2)) 
+0

'::'は何をしますか?それに精通していない。 – pstatix

+0

@pstatix Pythonのスライス構文: 'start:stop:stride' –

+0

あなたは必ずしも' :: 'を使う必要はありませんか? 1つの ':'は動作しますが、少なくとも@ RoachLordの投稿にはそういう形で表示されます。 – pstatix

0

ループ

bar = [2, 3, 4, 5, 6, 7, 8, 9, 10] 
for i in range(len(bar)): 
    if bar[i] % 2 != 0: 
     bar[i] = 0 
print(bar) 

出力

[2, 0, 4, 0, 6, 0, 8, 0, 10] 
+0

です。 –

0

あなたは

、ゼロに奇数インデックスの要素を設定するにはマップを使用することができますするための簡単な使用:同じです
bar = [2, 3, 4, 5, 6, 7, 8, 9, 10] 
print map(lambda i: 0 if bar.index(i)%2!=0 else i, bar) 

[2, 0, 4, 0, 6, 0, 8, 0, 10] 

またはあなたがゼロに奇数の要素の値を設定したい場合は、あなたがこれを行うことができ、

map(lambda i: 0 if i%2!=0 else i, bar) 
+0

あなたのケースでは、結果として私はイテレータを持っています。しかし、私はリストが必要 –

+0

どのバージョンのpythonを使用していますか?私はあなたがPython 2を使用していると確信しています、mapはイテレータではなく 'list'型を返します。 – Manjunath

+0

今、私はpython 3.5を使っていますが、私はPython 2に関する本を読んでいます。 –

0

は答えをすべてに感謝します。 Eatosthenesアルゴリズムのふるいの私の実装:

def resheto(data): 
    print("\tStart Resheto") 
    currentIndex = 0 

    while currentIndex < len(data) - 1: 
     data[currentIndex + data[currentIndex]::data[currentIndex]] = \ 
      [0] * ((len(data) + 1) // data[currentIndex] - 1) 
     currentIndex += 1 

     while currentIndex < len(data) - 1 and data[currentIndex] == 0: 
      currentIndex += 1 

     if currentIndex >= len(data) - 1: 
      break 
print("\tEnd Resheto") return data 
関連する問題