在Python中删除列表中的dupes

Jam*_*unn 9 python list python-2.7

基本上,我试图删除任何以相同值开头的列表.例如,下面的两个以数字1开头:

a = [[1,2],[1,0],[2,4],[3,5]]
Run Code Online (Sandbox Code Playgroud)

因为值1存在于两个列表的开头 - 我需要删除它们以便新列表变为:

b = [[2,4],[3,5]]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我试过下面的,但输出是: [[1, 2], [2, 4], [3, 5]]

def unique_by_first_n(n, coll):
    seen = set()
    for item in coll:
        compare = tuple(item[:n])
        print compare   # Keep only the first `n` elements in the set
        if compare not in seen:
            seen.add(compare)
            yield item

a = [[1,2],[1,0],[2,4],[3,5]]

filtered_list = list(unique_by_first_n(1, a))
Run Code Online (Sandbox Code Playgroud)

Joe*_*don 6

一个有效的解决方案是创建一个Counter对象来保存第一个元素的出现,然后过滤主列表中的子列表:

from collections import Counter
counts = Counter(l[0] for l in a)
filtered = [l for l in a if counts[l[0]] == 1]
#[[2, 4], [3, 5]]
Run Code Online (Sandbox Code Playgroud)

  • 不,我没有,但我看到一个循环,使解决方案过于复杂 (3认同)
  • `filtered = [l for a in a count [l [0]] == 1]`可能更清楚但是是的. (2认同)

jpp*_*jpp 6

如果您乐意使用第三方库,可以使用Pandas:

import pandas as pd

a = [[1,2],[1,0],[2,4],[3,5]]

df = pd.DataFrame(a)
b = df.drop_duplicates(subset=[0], keep=False).values.tolist()

print(b)

[[2, 4], [3, 5]]
Run Code Online (Sandbox Code Playgroud)

诀窍是keep=False论证,在文档中描述pd.DataFrame.drop_duplicates.

  • 我从来没有使用过熊猫,总是手动做这样的事情,就像其他答案一样,但这是另一个可读性水平 - >引起了我对图书馆的兴趣 - >有+1 (3认同)
  • @FabianN.,我当然不推荐Pandas作为*学习*的手段,但矢量化操作确实有它们的用途.我会很失望让人们相信Python`list` +`dict`是构建数据的唯一方法! (2认同)

blh*_*ing 5

您可以使用collections.Counter列表推导来获取第一个项目仅出现一次的子列表:

from collections import Counter
c = Counter(n for n, _ in a)
b = [[x, y] for x, y in a if c[x] == 1]
Run Code Online (Sandbox Code Playgroud)