Python 删除列表中的重复项和 1==1.0 True

Python removing duplicates in list and 1==1.0 True

我需要删除列表中的重复值,但是使用 set()for ... if not in... 循环我只能得到部分正确的决定。 例如 ['asd', 'dsa', 1, '1', 1.0]

我得到:

['asd', 'dsa', 1, '1']

但要求的结果是:

['asd', 'dsa', 1, '1', 1.0]

我怎样才能做到这一点?

这是 decorate-sort-undecorate pattern 的一个很好的例子,排序部分被修改为只创建一个集合:

dest = [el for el, ignore
        in set((x, type(x))
               for x in src)]

修饰步骤将元素类型添加到集合中,例如1和1.0比较不同。然后通过取消装饰集合获得最终列表,即删除不再需要的类型对象。

你可以试试

In [3]: [value for _, value in frozenset((type(x), x) for x in l)]
Out[3]: [1.0, '1', 1, 'dsa', 'asd']

我们创建一个(临时的)frozenset 包含元素及其类型的元组 - 以保持元素相等(例如 11.0True) 但有不同的类型。然后我们迭代它,解包元组并检索元素 (value)。

当然,我们也可以使用普通的 set,它是可变的,但我们不需要可变性,因为我们的集合是临时的。

请注意,这不一定会保留原始顺序。


如果您需要保留原始顺序,请使用 collections.OrderedDict, which is a hash map (just like regular dict),因此与 frozenset/set

的工作方式类似
In [16]: from collections import OrderedDict

In [17]: [value for _, value in OrderedDict.fromkeys((type(x), x) for x in l)]
Out[17]: ['asd', 'dsa', 1, '1', 1.0]