我有一长串类似的清单:
mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]
我想在每个列表的前两个位置之后删除任何重复的值,因此对于['1', 24, 'A', 'A']
,忽略位置1
和24
,然后考虑其余位置以查看是否存在是重复的。对于此列表,我需要输出['1', 24, 'A']
。列表的长度是可变的,长度从3到8个不等。
所需的全部输出是:
output = [['1', 24, 'A'], ['1', 35, 'A', 'B'], ['2', 12, 'B', 'C']]
每个列表中的顺序很重要,但列表中所有列表的整体顺序并不重要。
答案 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_setfrom 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']]