提问人:user21308739 提问时间:3/1/2023 更新时间:3/1/2023 访问量:63
如果我想按 spetific index 检查,如何删除列表列表中的 dulplicate 列表?
How to delete the dulplicate list in list of list if I want to check by spetific index?
问:
因此,我尝试通过仅检查列表中的一个元素来删除列表中的重复列表。我只知道从正常列表中删除重复项,你们能帮我吗?谢谢!
所以我想做的是只附加每个名字的一个列表,我已经对它进行了排序,每个人的最大值将是同名中另一个值的第一个。
输入 : 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)
答:
为此,您只需记录列表中已有的所有名称并进行比较即可。
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]
若要保留每个不同字符串遇到的第一个数字,可以将列表反向提供给字典构造函数。然后将项目转换回列表列表。由于字典构造函数每个键仅保存一个项,因此它会在提供重复项时更新现有项。因此,相反的顺序确保第一个出现项在字典中最后加载,并最终成为末尾的值。
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())
评论