2017-04-13 208 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名單的三個主要子列表「並且每個子列表在其他子列表中都包含一組數據。 我想獨立比較三個主要子列表中的子列表,並查看兩個子列表中的第一項是否匹配,我想刪除一個子列表並保留一個。例如,在第一數據「1己醇」重複三次,我想保持只有一個子表:

['1-hexanol', 5.10, 2544937.0] 

,並刪除其他兩個:

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

我試着下面的代碼,但它會給出錯誤:「TypeError:'int'object is not subscriptable」。

代碼:

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

錯誤消息告訴你的問題:你不能下標整數。 jk是整數。

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

也許你的意思是在2D表達式中使用它們作爲第一指標:

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

每個操作的評論UPDATE(第二個問題):

啊,是的 - 這是一個老問題:你在縮小列表的同時還在逐步完成。代碼無法按照您想要的方式工作:每次刪除一行時,都會更改較晚行的索引。首先,你錯過了一排;其次,你的循環試圖運行原始行數。

例如,您從10行開始,第3,4和6行(第0 - 9行)與第1行具有相同的第一個元素。j = 0時,從0到9運行k 0

當k達到3時,您會發現重複。刪除第3行並移至第4行...除了原始第4行現在是第3行,並且您現在正在查看的行是原始行5.您將該行傳遞給第6行,並且刪除也是如此。您繼續行7,通過它,然後行8 ...

除列表中沒有剩餘行8。你的循環依賴於一個運行於9的生成器:在你修改列表時不會改變。 k現在超出範圍。

修理 一般的解決方法是馬克行的,你找到他們後刪除。當您離開主標記循環時,進行第二階段刪除標記爲刪除的任何內容。同樣,小心不要跳過行:或者向後工作,或者使用循環並且只有當您的保持行時遞增索引。

+0

謝謝你提示這麼多剪枝回覆。我試過了,問題解決了。但我仍然得到重複未刪除。 我在'if'語句之後說過,'del k',但它不會刪除重複項。當我使用'del I [k]'時,它會給出一個錯誤「IndexError:列表索引超出範圍」。 我對這個範圍函數有點困惑。 我們可以在不使用'range'的情況下解決這個問題嗎? – Hashmi

+0

(1)這是一個單獨的問題,需要單獨發佈問題; (2)閱讀發佈指南:我們需要發佈我們可以剪切和粘貼的代碼,這將重現問題。包含*完整*錯誤消息。 – Prune

+0

爲了檢查我正在嘗試的觀點,我按照我的建議更改了代碼,並將** All_Data **設置爲列表的列表。我沒有得到你引用的錯誤。請發佈可重現您現在看到的問題的最小代碼 - 作爲單獨的問題。 – Prune

0

儘管@Prune已經在您的代碼中提供了有關錯誤的詳細說明,但我想爲您的問題提供替代解決方案。

基本上,可以定義一個函數remove_duplicate爲您的第二級陣列基於它的第一元件上,以除去第三級陣列,然後生成的與list comprehensive最終結果:

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

非常感謝Shizhz。解決了這個問題。 – Hashmi