在列表列表中的每个列表中删除重复值

时间:2019-02-13 05:38:54

标签: python

我有一长串类似的清单:

mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]

我想在每个列表的前两个位置之后删除任何重复的值,因此对于['1', 24, 'A', 'A'],忽略位置124,然后考虑其余位置以查看是否存在是重复的。对于此列表,我需要输出['1', 24, 'A']。列表的长度是可变的,长度从3到8个不等。

所需的全部输出是:

output = [['1', 24, 'A'], ['1', 35, 'A', 'B'], ['2', 12, 'B', 'C']]

每个列表中的顺序很重要,但列表中所有列表的整体顺序并不重要。

5 个答案:

答案 0 :(得分:4)

您可以使用一套包装:

$fileName

输出:

mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]
new_list = [[a, b, *[h for i, h in enumerate(c) if h not in c[:i]]] for a, b, *c in mylist]

答案 1 :(得分:2)

您可以使用collections.OrdederDict删除重复项。它将维持元素的顺序。

from collections import OrderedDict

mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]
[[a,b, *list(OrderedDict.fromkeys(c))] for a,b,*c in mylist]

这将给出输出

[['1', 24, 'A'], ['1', 35, 'A', 'B'], ['2', 12, 'B', 'C']]

修改

Mykola Zotko的注释中所述,在python 3.7中,您也可以安全地使用dict

[[a,b, *list(dict.fromkeys(c))] for a,b,*c in mylist]

答案 2 :(得分:0)

here

安装ordered_set
from ordered_set import OrderedSet
mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]
for i in range (len(mylist)): mylist[i] = list(OrderedSet(mylist[i]))
print(mylist)

输出将为

  

[['1',24,'A'],['1',35,'A','B'],['2',12,'B','C']]

答案 3 :(得分:0)

我修改了Ajax1234的解决方案。您可以使用一个小的辅助函数来过滤其余元素。与集合相比,运算符in使用集合要快得多:

mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]

def filt(l):
    s = set()
    for i in l:
        if i not in s:
            s.update(i)
            yield i

l = [[i, j, *filt(k)] for i, j, *k in mylist]

答案 4 :(得分:0)

mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]
result = [x[0:2] + list(set(x[2:])) for x in mylist]
print(result)

输出:

[['1', 24, 'A'], ['1', 35, 'A', 'B'], ['2', 12, 'C', 'B']]