Python 去重

2 投票
6 回答
980 浏览
提问于 2025-04-16 13:22

在一个数组里,我有以下这些元组:

  ('0000233/02', 50.0, None, None, None, None, 'Yes') 
  ('0000233/02', 200.0, None, None, None, None, 'Yes') 

如果我在遍历这个列表,我该怎么做才能仅仅根据第一个元素来去掉重复的项呢?

6 个回答

1

临时解决方案:

def unique_elem0( iterable ):
    seen = set()
    seen_add = seen.add
    for element in iterable:
        key = element[0]
        if key not in seen:
            seen_add(key)
            yield element

print list(unique_elem0(lst))

itertools 说明书中“复制代码”的解决方案:

def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in ifilterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element

from operator import itemgetter        
print list(unique_everseen(lst, key=itemgetter(0)))
1

如果你的输入数据是排好序的(或者至少重复的部分都在一起),那么可以用一种稍微不同的方法,那就是使用itertools.groupby:

import itertools, operator

def filter_duplicates(items):
    for key, group in itertools.groupby(items, operator.itemgetter(0)):
        yield next(group)

这个方法会从每一组重复的项中选出第一个。这种方法比基于集合或字典的方法更有效,因为它不需要额外的结构,并且能保持原始顺序。不过,这种方法依赖于重复的项是成批出现的——如果重复项可能在数据流的任何地方出现,那就要使用其他的方法了。

3

把它们放进一个字典里,用第一个元素当作键。如果你在添加之前检查一下,那你会得到那个键对应的第一个项目;否则,你就会得到最后一个项目。

撰写回答