Python 在列表列表中的每个列表中删除重复值
我有一个长长的列表,如下所示:Python 在列表列表中的每个列表中删除重复值,python,Python,我有一个长长的列表,如下所示: mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']] 我想在每个列表中的前两个位置之后删除任何重复的值,所以对于 [1,24,' a ',' a ')< /> >,忽略位置 1 < /C>和 24 > /Cord>,然后考虑剩下的位置,看看是否有重复。对于这个列表,我需要输出['1',24',A']。列表长度是可变的,从3到8项不等 全部期望输出为:
mylist = [['1', 24, 'A', 'A'], ['1', 35, 'A', 'B', 'B'], ['2', 12, 'B', 'C', 'B']]
我想在每个列表中的前两个位置之后删除任何重复的值,所以对于<代码> [1,24,' a ',' a ')< /> >,忽略位置<代码> 1 < /C>和<代码> 24 > /Cord>,然后考虑剩下的位置,看看是否有重复。对于这个列表,我需要输出
['1',24',A']
。列表长度是可变的,从3到8项不等
全部期望输出为:
output = [['1', 24, 'A'], ['1', 35, 'A', 'B'], ['2', 12, 'B', 'C']]
每个列表中的顺序很重要,但不是列表中所有列表的总体顺序 您可以将解包与一组:
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', 24, 'A'], ['1', 35, 'A', 'B'], ['2', 12, 'B', 'C']]
您可以使用
collections.ordedirect
删除重复项。它将保持元素的顺序
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]
从中安装订购的_集 输出将是 [1',24',A'],[1',35',A',B'],[2',12',B',C']]
我已经修改了Ajax1234的解决方案。您可以使用一个小的辅助函数来过滤其余的元素。中的运算符
处理集合的速度比处理列表的速度快得多:
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]
输出:
[['1', 24, 'A'], ['1', 35, 'A', 'B'], ['2', 12, 'C', 'B']]
使用set()
的原始答案似乎很好地保留了顺序,这是意外的吗?@这只是巧合,因为set
会自动返回排序结果。碰巧您的示例输入包含已排序的尾随值。效率非常低。为c中的每个元素创建一个新列表。另外,
中的操作符对列表的处理速度不是很快。在Python 3.7中,默认情况下dict的顺序是:dict.fromkeys()
。
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']]