从Python中的列表中删除重复项和类似值?

时间:2013-04-22 17:03:14

标签: python

这个问题是对How do you remove duplicates from a list in whilst preserving order?的跟进。

我需要从列表中删除重复项和/或类似的值:

我从这个问题的答案开始并申请:

def f7(seq):
    seen = set()
    seen_add = seen.add
    return [ x for x in seq if x not in seen and not seen_add(x)]

但是当我将它应用于我的数据/数组时,我得到的这显然是错误的,因为粗体的值是相等的,应该删除一个

 [(Decimal('1.20149'), Decimal('1.25900')),
 *(Decimal('1.13583'), Decimal('1.07862'))*,
**(Decimal('1.07016'), Decimal('1.17773'))**,
 *(Decimal('1.13582'), Decimal('1.07863'))*,
  (Decimal('1.07375'), Decimal('0.92410')),
  (Decimal('1.01167'), Decimal('1.00900')),
**(Decimal('1.07015'), Decimal('1.17773'))**,
  (Decimal('0.95318'), Decimal('1.10171')),
  (Decimal('1.01507'), Decimal('0.79170')),
  (Decimal('0.95638'), Decimal('0.86445')),
  (Decimal('0.90109'), Decimal('0.94387')),
  (Decimal('0.84900'), Decimal('1.03060'))]

您如何删除那些相同的值?

1 个答案:

答案 0 :(得分:3)

从输出中,看起来你传递的seq包含2元组。虽然里面的元组可能是相同的,但是元组本身(它们是序列的元素)不是,因此不会被删除。

如果您打算获得一个唯一数字的平面列表,您可以先将其展平:

seq = [ (1,2), (2,3), (1,4) ]
f7(itertools.chain(*seq))
=> [1, 2, 3, 4]