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
包含元素及其类型的元组 - 以保持元素相等(例如 1、1.0 和 True) 但有不同的类型。然后我们迭代它,解包元组并检索元素 (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]
我需要删除列表中的重复值,但是使用 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
包含元素及其类型的元组 - 以保持元素相等(例如 1、1.0 和 True) 但有不同的类型。然后我们迭代它,解包元组并检索元素 (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]