Python 去重
在一个数组里,我有以下这些元组:
('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
把它们放进一个字典里,用第一个元素当作键。如果你在添加之前检查一下,那你会得到那个键对应的第一个项目;否则,你就会得到最后一个项目。