Python 保持列表的原顺序并进行去重的方法




现象

>>> l = [5, 2, 5, 3, 1, 8, 6, 7, 3]
>>> l1 = list(set(l))
>>> l1
[1, 2, 3, 5, 6, 7, 8]


处理方法

利用集合去重, 然后用原列表的 index 方法排序

>>> l1.sort(key=l.index)
>>> l1
[5, 2, 3, 1, 8, 6, 7]

or

>>> l1 = sorted(set(l), key=l.index)
>>> l1
[5, 2, 3, 1, 8, 6, 7]


利用 for 和 if 进行有序去重

>>> l1 = []
>>> for i in l:
...   if not i in l1:
...     l1.append(i)
...
>>> l1
[5, 2, 3, 1, 8, 6, 7]

or 

>>> l1 = []
>>> [l1.append(i) for i in l if not i in l1]
[None, None, None, None, None, None, None]
>>> l1
[5, 2, 3, 1, 8, 6, 7]


利用字典的 key 值不重复的特性去重

>>> new_dict = {}.fromkeys(l)
>>> new_dict
{5: None, 2: None, 3: None, 1: None, 8: None, 6: None, 7: None}
>>> list(new_dict.keys())
[5, 2, 3, 1, 8, 6, 7]


去重并保证列表顺序 (反向)

>>> l = [5, 2, 5, 3, 1, 8, 6, 7, 3]
>>> l_reversed = list(reversed(l))
>>> l_reversed
[3, 7, 6, 8, 1, 3, 5, 2, 5]
>>> l1 = list(set(l))
>>> l1
[1, 2, 3, 5, 6, 7, 8]
>>> l1.sort(key=l_reversed.index)
>>> l1
[3, 7, 6, 8, 1, 5, 2]
>>> l1.reverse()
>>> l1
[2, 5, 1, 8, 6, 7, 3]


def deduplicate_and_keep_list_order(l, reverse=False):
    if reverse:
        l_reversed = list(reversed(l))

        return list(reversed(sorted(set(l), key=l_reversed.index)))
    else:
        return sorted(set(l), key=l.index)