Python删除list和1==1.0 Tru中的重复项

2024-04-16 11:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我得到:

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

但要求的结果是:

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

我怎样才能做到这一点?你知道吗


Tags: in列表forifnotsetasddsa
2条回答

你可以试试

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

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

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

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


如果需要保留原始顺序,请使用^{},这是一个哈希映射(与常规的^{}类似),因此其工作方式类似于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]

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

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

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

相关问题 更多 >