2024-05-16 14:20:40 发布
网友
我需要删除列表中的重复值,但是使用set()或for ... if not in...循环只能得到部分正确的决定。 例如['asd', 'dsa', 1, '1', 1.0]
set()
for ... if not in...
['asd', 'dsa', 1, '1', 1.0]
我得到:
['asd', 'dsa', 1, '1']
但要求的结果是:
我怎样才能做到这一点?你知道吗
你可以试试
In [3]: [value for _, value in frozenset((type(x), x) for x in l)] Out[3]: [1.0, '1', 1, 'dsa', 'asd']
我们创建一个包含元素及其类型的(临时)元组^{},以保持元素相等(例如1、1.0和True),但类型不同。然后我们迭代它,解压元组并检索元素(value)。你知道吗
value
当然,我们也可以使用普通的set,它是可变的,但是我们不需要可变的,因为我们的集合是临时的。你知道吗
set
请注意,这不一定会保留原始顺序。你知道吗
如果需要保留原始顺序,请使用^{},这是一个哈希映射(与常规的^{}类似),因此其工作方式类似于frozenset/set
frozenset
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比较不同。最后的列表是通过取消装饰集合来获得的,即删除不再需要的类型对象。你知道吗
你可以试试
我们创建一个包含元素及其类型的(临时)元组^{} ,以保持元素相等(例如1、1.0和True),但类型不同。然后我们迭代它,解压元组并检索元素(
value
)。你知道吗当然,我们也可以使用普通的
set
,它是可变的,但是我们不需要可变的,因为我们的集合是临时的。你知道吗请注意,这不一定会保留原始顺序。你知道吗
如果需要保留原始顺序,请使用^{} ,这是一个哈希映射(与常规的^{} 类似),因此其工作方式类似于
frozenset
/set
对于decorate-sort-undecorate pattern,这是一个很好的例子,排序部分被修改为只创建一个集合:
装饰步骤将元素类型添加到集合中,以便例如1和1.0比较不同。最后的列表是通过取消装饰集合来获得的,即删除不再需要的类型对象。你知道吗
相关问题 更多 >
编程相关推荐