2017-01-03 12 views
-1

私のプログラミングのクラスでは、数字が等しい場合、リストの2つの連続する数字のうちの2番目の数字をゼロで置き換えることが目的です。例についてはリスト内の数字を置き換える方法は?

:私はこれを行うにしようとしたとき

def zeroDuplicates([1,5,2,7,7])出力[1,5,2,7,0]

はしかし、私は常にエラーになるだろう。 私はこれまで、次のされているもの:私はこのプログラムを実行するとき

def zeroDuplicates(nums): 
    count =0 
    for n in nums: 
     if n == nums[n-1]: 
      nums.replace[n,0] 
    return nums 

エラーメッセージ:

"Error: 'list' object has no attribute 'replace'" 
+0

どのようなエラーが発生しますか?質問をするときは、常に正確なエラーメッセージを含めてください。 – arshajii

+4

'n'は値のインデックスではなく、forループの値そのものです。 – karakfa

+0

"エラー: 'リスト'オブジェクトに属性 '置換'がありません" –

答えて

2

nをあなたの例では要素です。インデックスではありません。

問題をより明確にする(ロボットにやさしい):1からリストの長さに反復したい場合は、疑似コードとしてのプログラムは要素を置き換えます。現在の要素が前の要素と等しい場合は、ゼロで置き換えます。

今、(私たちはインデックスを示すためにiを使用)のPythonに英語から翻訳できます:

def zeroDuplicates (nums): 
    for i in range(1, len(nums)): 
     if nums[i] == nums[i-1]: 
      nums[i] = 0 
    return nums 

ボーナス:あなた缶 "pythonize" それ、リストの内包表記を使用してビュン:

def zeroDuplicates (nums): 
    return [nums[0]] + [(0 if a == b else a) for a, b in zip(nums[1:], nums[:-1])] 

(すべての要素とその後継要素が後続要素と等しい場合は0になります。そうでない場合は変更されません)。

1

あなたは上記のコードは、繰り返し値がその前に索引-1場所が、はるかにない発生した場合はどう

を処理しないという別の問題がありますか?

values = [1,5,7,2,7,7] 

values_added = set() 
new_values = [] 

for val in values: 
    if val in values_added: 
     new_values.append(0) 
    else: 
     new_values.append(val) 
     values_added.add(val) 

print(values_added) 

print(new_values) 

出力:あなたのアプローチはまた、いくつかの値が同一であれば、私はあなたが潜在的に変更された値に比較しないように、新しいリストを作成するために助言する動作しないでしょう

{1, 2, 5, 7} # values_added 
[1, 5, 7, 2, 0, 0] # new_values 
+0

私は、OPが「2つの連続した2つの連続**ゼロのリストにある数字 " – MSeifert

+0

@MSeifert True。 –

+1

@Ademöztaşこれは私がこのコードで探しているものではありません。値がすでにリストに追加されているかどうかを知る必要があります。私はリストに追加したものと私が持っていないものを追跡する必要があります。ここで、set(Values)は私にすべてのユニークな値を与えます。 –

0

注意。

from itertools import groupby 

res = [] 
for item, group in groupby([1,2,3,3,3,3,2,1]): 
    identicals = list(group) 
    # Append the item 
    res.append(item) 
    # Extend the list with x zeros where x is the number of successive duplicates 
    res.extend([0] * (len(identicals) - 1)) 

>>> res 
[1, 2, 3, 0, 0, 0, 2, 1] 
0

あなたはこのように試すことができ、

def zero_duplicates(nums): 
    items = [] 
    for item in nums: 
     if item not in items: 
      items.append(item) 
     else: 
      items.append(0) 
    return items 

vals = [1, 5, 2, 7, 7] 
print zero_duplicates(vals) 

出力:

[1, 5, 2, 7, 0] 

追加情報:

私は、この場合には、完璧なフィット感を思わ itertools.groupbyを使用することをお勧めします

関数名は小文字にする必要があります読みやすさを向上させるために必要に応じてアンダースコアで区切られた単語。

mixedCaseは、下位互換性を維持するために既に優勢なスタイル(たとえばthreading.py)のコンテキストでのみ使用できます。

リンク:https://www.python.org/dev/peps/pep-0008/#function-names

関連する問題