2017-04-13 197 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