2017-12-19 11 views
4
source=[1,2,3,4,2,3,5,6] 

dst=[] 
for item in source: 
    if item not in dst: 
     dst.append(item) 

print(dst) # [1,2,3,4,5,6] 

が、私はこのようなものの上にコードを簡素化することができ、「場合」:とPythonでのリスト作成のための条件は

dst=[item for item in [1,2,3,4,2,3,5,6] if item not in 'this array'] 

おかげ

+3

「この」配列への参照はあらかじめありません。さらに、この一意性フィルタは、アイテムがハッシュ可能である場合に改善することができる。 –

+2

あなたは 'set()'を使うことができます。あなたはすべてのユニークなアイテムだけを取得します – Gahan

+1

@Gahan: 'set'が注文を変更できるので、それ自体ではありません。 –

答えて

5

セットは、それが作成されている間、あなたがにこの配列を参照することができないので、あなたが探しているものはおそらくです:

>>> source = [1,2,3,4,2,3,5,6] 
>>> set(source) 
{1, 2, 3, 4, 5, 6} 

あなたが元の順序を維持したいならば、しかし、あなたが追跡することができます

>>> source = [1,2,3,4,2,3,5,6] 
>>> seen = set() 
>>> dst = [] 
>>> for i in source: 
>>>  if i not in seen: 
>>>   dst.append(i) 
>>>   seen.add(i) 
>>> 
>>> dst 
[1, 2, 3, 4, 5, 6] 
+1

そのセットは順序が整っておらず、元の順序が緩んでいる可能性があります(実際には、実際には緩んでいないという事実は実装事故です)。 –

+0

@ brunodesthuilliers良い点。私は元の順序を考慮したアプローチでソリューションを補完しました。 – grovina

+0

list(set(source)) - 最も速い方法:) –

6

いいえ、リストの内包表記は自己参照することはできません。

リストから重複を削除すると思われるようです。この問題へのアプローチのボートロードについては、thisthisの質問を参照してください。

0

場合はどのようにこのことについて、要件 ある場合とに使用して:あなたはすでにセット(seen)でdstに追加したかの?

[dst.append(item) for item in source if item not in dst] 
3

あなたはリスト内包内からdstを参照することはできませんが、各反復でそれをスライスしてsourceで以前に反復項目に対する現在の項目を確認することができます。

source = [1, 2, 3, 4, 2, 3, 5, 6] 
dst = [item for i, item in enumerate(source) 
     if item not in source[0:i]] 

print(dst) # [1, 2, 3, 4, 5, 6] 
0

まあの代わりに、新しいリストを作成すると、以下のようにリストの理解度を使って既存のリストを変更できます。

In [1]: source 
Out[1]: [1, 9, 2, 5, 6, 6, 4, 1, 4, 11] 

In [2]: [ source.pop(i) for i in range(len(source))[::-1] if source.count(source[i]) > 1 ] 
Out[2]: [4, 1, 6] 

In [3]: source 
Out[3]: [1, 9, 2, 5, 6, 4, 11] 

別のアプローチとして、最初にセットで一意のリストを取得し、次のようにソースインデックス値を参照してソートします。

source = [1, 9, 2, 5, 6, 6, 4, 1, 4, 11] 
d = list(set(source)) 
d.sort(key=source.index) 
print(d) # [1, 9, 2, 5, 6, 4, 11] 
関連する問題