2017-10-11 12 views
1

ネストされたリストから一意のデータを抽出したいのですが、下記を参照してください。私はこれの2つの方法を実装しました。最初のものはうまくいくが、もう1つは失敗した。計算中にnew_dataは空ですか?そして私はそれをどのように修正するのですか?Pythonでネストされたリストから一意のリストを抽出します

data = [                                  
    ['a', 'b'],                                
    ['a', 'c'],                                
    ['a', 'b'],                                
    ['b', 'a']                                 
]                                    

# working                                   
new_data = []                                 
for d in data:                                 
    if d not in new_data:                              
     new_data.append(d)                              
print(new_data)                                
# [['a', 'b'], ['a','c'], ['b','a']]                           

# Failed to extract unique list                                 
new_data = []                                 
new_data = [d for d in data if d not in new_data]                        
print(new_data)                                
# [['a', 'b'], ['a', 'c'], ['a', 'b'], ['b', 'a']] 
+3

はい、 'new_data'がリストの実行中に空であるが、その結果は実行後に 'new_data'に割り当てられます。 –

+1

オリジナルのバージョンを使用してください...それはあなたがそれを修正する方法です。 –

+0

'new_dataにはありません'をテストするときは、 'new_data'には何もありません。リストの解説は完了するまで実行されてから、代入演算子に戻り、結果を 'new_data'に保存します。 – Aaron

答えて

2

ただ、試してみてください。リストはハッシュ可能でないため

new_data = [list(y) for y in set([tuple(x) for x in data])] 

あなたはリストのリストにset()を使用することはできません。リストのリストをタプルのリストに変換します。 set()を適用して複製を削除します。次に、複写されたタプルのリストをリストのリストに戻します。

のみコピーの最初のインスタンスが取得されるように、現在の値の前に何のコピーが存在しないことをテストする enumerateを使用することができ
0

new_data = [item for index, item in enumerate(data) if item not in data[:index]] 
関連する問題