如果我想按 spetific index 检查,如何删除列表列表中的 dulplicate 列表?

How to delete the dulplicate list in list of list if I want to check by spetific index?

提问人:user21308739 提问时间:3/1/2023 更新时间:3/1/2023 访问量:63

问:

因此,我尝试通过仅检查列表中的一个元素来删除列表中的重复列表。我只知道从正常列表中删除重复项,你们能帮我吗?谢谢!

所以我想做的是只附加每个名字的一个列表,我已经对它进行了排序,每个人的最大值将是同名中另一个值的第一个。

输入 : liz = [['Lina', 60], ['Gaga', 0], ['Dene', 100], ['Dene', 80], ['Dene', 0], ['Helen', 0], ['Will', 100]] 预期输出 : lix = [['Lina', 60], ['Gaga', 0], ['Dene', 100], ['Helen', 0], ['Will', 100]]

我试图达到它,它只是将所有列表附加到列表中,因为它不等于最近的所有,因为它的 index[1] 值:

lix = []
for ele in liz:
        if ele not in lix:
            lix.append(ele)
python python-3.x 列表 循环嵌 套列表

评论

1赞 Ahmad Anis 3/1/2023
你为什么不使用字典?

答:

1赞 Ahmad Anis 3/1/2023 #1

为此,您只需记录列表中已有的所有名称并进行比较即可。

lix = {} # use dict instead of list
for pair in liz:
    if pair[0] in lix:
        if lix[pair[0]] < pair[1]: # if it is not the largest, add the largest
            lix[pair[0]] = pair[1]
    else:
        lix[pair[0]] = pair[1]

1赞 Alain T. 3/1/2023 #2

若要保留每个不同字符串遇到的第一个数字,可以将列表反向提供给字典构造函数。然后将项目转换回列表列表。由于字典构造函数每个键仅保存一个项,因此它会在提供重复项时更新现有项。因此,相反的顺序确保第一个出现项在字典中最后加载,并最终成为末尾的值。

liz = [['Lina', 60], ['Gaga', 0], ['Dene', 100], ['Dene', 80], 
       ['Dene', 0], ['Helen', 0], ['Will', 100]]

lix = [*{L[0]:L for L in liz[::-1]}.values()][::-1]

print(lix)

[['Lina', 60], ['Gaga', 0], ['Dene', 100], ['Helen', 0], ['Will', 100]]

执行此操作的另一种方法是使用一组已查看的值,在浏览项目时检查这些值以进行筛选和扩充:

seen = set()
lix = [L for L in liz if not (L[0] in seen or seen.add(L[0]))]

没有集合也可以完成相同的操作,但由于用于检查每个项目的顺序搜索过程,运行速度会慢得多:

lix = list()
lix.extend(L for L in liz if all(L[0] != used for used,*_ in lix) )

如果列表的排序顺序已经具有连续组中的重复名称(并且重复名称的数字按递减顺序排列),则可以直接使用 itertools 中的 groupby 函数:

from itertools import groupby
lix = [L for _,(L,*_) in groupby(liz,lambda i:i[0])]

如果未排序,则可以使用复合键对其进行排序:

liz.sort(key=lambda x:(x[0],-x[1]))  

# negating x[1] produces a decreasing order of numbers for identical names

请注意,liz.sort(reverse=True) 也可以工作,但会以相反的字母顺序为您提供名称

如果您根本不想对列表进行排序,但希望每个名称的数字最大,则可以使用简单的 for 循环构建所选子列表的字典,并使用其值作为最终输出:

selected = dict()
for L in liz:
    if L[0] not in selected or L[1] > selected[L[0]][1]:
        selected[L[0]] = L
lix = list(selected.values())