2017-04-13 22 views
1

のリストのリストから重複リスト項目を削除:は、次のように私はリストのリストのリストを持っているリスト

All_Data= [[['Chemical Name', 'Average Ret. Time', 'Maximum Area'], 
['1-hexanol', 5.10, 2544937.0], ['1-hexanol', 8.69, 3798101.0], 
['1-hexanol', 5.54, 2470679.0], ['2-propanone-1-hydroxy-', 1.97, 227607.0], 
['acetic acid', 1.962, 227607.0], ['acetic acid', 1.75, 38359423.0], 
['acetoin', 2.32, 478054.0]], 
[['Chemical Name', 'Average Ret. Time', 'Maximum Area'], ['1-pentanol', 3.00, 24864.0], 
['2-heptanone', 5.54, 10027158.0], ['2-pentanone', 2.10, 858204.0], 
['2-pentanone', 2.03, 858204.0], ['2-pentanone', 2.037, 858204.0], 
['2-pentanone', 1.97, 858204.0], ['pentane, 2,3,3-trimethyl-', 2.84, 1775913.0], 
['pentane, 2,3,4-trimethyl-', 2.75, 807020.0]], 
[['Chemical Name', 'Average Ret. Time', 'Maximum Area'], ['.alpha.-pinene', 7.00, 8190.0], 
['.alpha.-pinene', 8.729, 21582890.0], ['ethyl hexanoate', 9.47, 71863418.0], 
['nonanal', 13.93, 10301295.0], ['pentanoic acid, ethyl ester', 5.88, 19659678.0], 
['propanoic acid, ethyl ester', 2.30, 8107638.0]]] 

ので、リストには、3つのレベルが含まれています:「All_Dataという名前のリストには主に3つのサブリストがあります。各サブリストは、さらなるサブリスト内のデータセットを含む。 3つのメインサブリスト内のサブリストを個別に比較して、2つのサブリストの最初の項目が一致するかどうかを確認したいので、1つのサブリストを削除してそのまま保持したいのですか?

['1-hexanol', 5.10, 2544937.0] 

と他の二つを削除します:たとえば、最初のデータ「1ヘキサノール」で3回繰り返され、私はちょうど1サブリストを維持したい

['1-hexanol', 8.69, 3798101.0], ['1-hexanol', 5.54, 2470679.0] 

私は、次のコードを試みたが、エラー: "TypeError: 'int'オブジェクトは添字付きではありません。

コード:

for i in All_Data: 
    for j in range(0, len(i)): 
     for k in range(1, len(i)): 
      if i[j[0]] == i[k[0]]: 
       del i[k[0]] 

この上で私を助けてください。

種類よろしく、 アリエラーメッセージがあなたの問題を伝え

答えて

1

:あなたは整数を添え字することはできません。 jおよびkは整数である。

if i[j[0]] == i[k[0]]: 

はおそらく、あなたは、2D表現の最初のインデックスとしてそれらを使用するためのもの:OPさんのコメント(第2の問題)あたり

if i[j][0] == i[k][0]: 

UPDATE:

ああ、はい - これは古い問題です。あなたがまだステップを進んでいる間にリストを短くしています。コードは、あなたが望むように動作しません:行を削除するたびに、後の行のインデックスを変更します。まず、行が欠けている。第2に、あなたのループは元の数の行を実行しようとしています。

たとえば、3行目、4行目、6行目(0〜9)は1行目と同じ最初の要素から始まります。j = 0の場合、0〜9の範囲でkを実行します。

kが3に達すると、重複が見つかります。行3を削除して行4に移動します。元の行4は現在行3になります。現在見ている行は元の行5です。これを渡して6行目に移動し、 そのうちも削除してください。 7行目、8行目、12行目を続けます。

リストに行8が残っていないことを除いて、あなたのループは9を経て実行されるジェネレータに依存します。リストを変更すると変更されません。 kは現在範囲外です。

修理 一般的な解決策はマーク、あなたがそれらを見つけると、後で削除のため行にあります。メインのマーキングループを離れるときは、削除のマークが付けられたものをすべて削除するために2回目のパスを作成します。再び、行をスキップしないように注意してください。逆順に処理するか、またはをループしながらを使用して、の場合にのみインデックスをインクリメントしてください。

+0

はあなたのプロンプトのために多くプルーンをありがとう応答。私は試して、その問題は解決されます。しかし、まだ私は削除されていない重複を取得しています。 私は 'if'ステートメントの後に' del k'と言っていますが、重複は削除しません。 'del I [k]'を使うと、 "IndexError:list index of range"というエラーが出ます。 この範囲機能について少し混乱しています。 この問題は 'range'を使わずに解決できますか? – Hashmi

+0

(1)それは別の質問掲示を必要とする別の問題です。 (2)投稿のガイドラインを読んでください:私たちはカット&ペーストできるコードを投稿する必要があり、問題が再現されます。 *完全な*エラーメッセージを含めてください。 – Prune

+0

私が作ろうとしている点をチェックするだけで、提案したようにコードを変更し、** All_Data **をリストのリストに設定しました。私はあなたが引用したエラーを得ることはありません。あなたが今見ている問題を再現する最小限のコードを別の質問として投稿してください。 – Prune

0

@Pruneはコード内のエラーの詳細な説明を提供していますが、私はあなたの問題の代替ソリューションを提供したいと思います。

基本的に、あなたはその最初の要素に基づいて、第三レベルアレイを削除し、list comprehensiveであなたの最終的な結果を生成するために、あなたの第二レベルのアレイの機能remove_duplicateを定義することができます。

def remove_duplicate(sublist):  
    seen = set() 
    return [e for e in sublist if not (e[0] in seen or seen.add(e[0]))] 

result = [remove_duplicate(sublist) for sublist in All_Data] 
+0

ありがとうございました。問題を解決しました。 – Hashmi

関連する問題