2017-12-05 3 views
1

は、私たちは私たちが整数のリストを持っているとしましょう:リターンを使わずに整数の元のリストが変更された関数を書くには?

リスト= [6、4、1、4、4、4、4、4、2、1]

私は今返す関数を書きました上のリストのすべての整数を反復子なしで含む別のリスト

def no_repeats(s): 
    new_list = [] 
    for number in s: 
     if new_list.count(number) < 1: 
      new_list.append(number) 
    return(new_list) 

new_listは[6、4、1、2]を返します。私の質問は、今では2つの同様の関数を書く方法です:

上記の関数のように新しいリストを返さないが、繰り返すすべての数値を削除して元のリストを変更する関数clean(s)。したがって、結果は同じでなければならず、関数は "return"を含むものでも、新しいリストを作成してもいけません。 オリジナルリストのみをクリーニングする必要があります。

元のリストを変更します(新しいリストを返しません)。今回は、元のリストのすべての数値を倍にすることで倍にします。 6,6、4、4、1、1、4、4、4、4、4、4、4、4、4、4 [

:したがって、二重(リスト)に上記元のリストを変更する必要があります、2,2,1,1]

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

+0

この答えは非常にあなたがソリューションを実装している特定の言語に依存し、関連するタグを編集してください。 – Thebluefish

+0

申し訳ありません。言語はPython 3+です。 –

答えて

1

で:

def no_repeats(L): 
    L[:] = set(L) 

several variations possible(全順序を定義していないアイテムをサポートし、非ハッシュ可能アイテムをサポートする、順序を保持)などがあります。

from collections import OrderedDict 

def no_repeats(L): 
    L[:] = OrderedDict.fromkeys(L) 

各要素の値をインプレース倍増する:

def double(L): 
    for i in range(len(L)): 
     L[i] *= 2 
を、秩序を維持するために210

は、各要素複製するには:。

def duplicate_elements(L): 
    L[:] = [x for x in L for _ in range(2)] 
1
>>> def clean(s): 
...  s[:] = [s[i] for i in range(len(s)) if s[i] not in s[:i]] 
... 
>>> st = [1, 2, 3, 2, 1] 

>>> clean(st) 
>>> st 
[1, 2, 3] 

>>> def double(s): 
...  s[:] = [s[i//3] for i in range(3*len(s)) if i % 3] 
... 
>>> st = [1, 2, 3, 2, 1] 
>>> double(st) 
>>> st 
[1, 1, 2, 2, 3, 3, 2, 2, 1, 1] 

でもない、特に効率的でも神託のですまだ

はデフ倍増OPの質問(複数可)に対処行います。■... を[:] = [S [I// 2] iに対する範囲(2 * LEN(S))に]

も行いますトリック、順序を保存せずにインプレース重複を削除少しobsfucation

+0

これはかなり興味深いコードShpielMeisterです!どうもありがとうございます。あなたは2番目の機能で何をしたのか多分詳しく説明できますか?私はあなたがしたことを学びたいと思います。 :) –

+1

は、含まれる答えを編集しました。楽しい。 – ShpielMeister

+1

私たちはちょうど 'ゆっくり'リストを実行するために必要な緊急事態として。さらに単純になる可能性がある。 i // 2は、iが4か5かどうかにかかわらず同じ結果を返します。私は答えに追加します – ShpielMeister

関連する問題