所以我尝试通过仅检查该列表中的一个元素来删除列表列表中的重复列表。我只知道从普通列表中删除重复项,你们能帮帮我吗?谢谢!
所以我想做的是只为每个名称附加一个列表,我已经对其进行排序,每个人的最大价值将是同名另一个值的第一个。
输入:liz = [['Lina', 60], ['Gaga', 0], ['Dene', 100], ['Dene', 80], ['Dene', 0], ['Helen' , 0], ['将', 100]] 预期输出:lix = [['Lina', 60], ['Gaga', 0], ['Dene', 100], ['Helen', 0], ['Will', 100]]
我试图达到它并且它只是将所有列表附加到列表中因为它不等于最近的所有因为它的索引 [1] 的值:
lix = []
for ele in liz:
if ele not in lix:
lix.append(ele)
groupby
对给定名称的所有值进行分组,并使用 max
找到每个名称的最大值:
liz = [['Lina', 60], ['Gaga', 0], ['Dene', 100], ['Dene', 80], ['Dene', 0], ['Helen', 0], ['Will', 100]]
liz = sorted(liz, key=lambda l:l[0])
lix = [max(g, key=lambda l:l[1]) for _, g in itertools.groupby(liz, key=lambda l:l[0])]
输出:
[['Dene', 100], ['Gaga', 0], ['Helen', 0], ['Lina', 60], ['Will', 100]]
为此,您可以简单地记录列表中已有的所有名称并进行比较。
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 = [*map(list,dict(liz[::-1]).items())][::-1]
print(lix)
[['Will', 100], ['Helen', 0], ['Dene', 100], ['Gaga', 0]]
另一种方法,也适用于包含 2 个以上项目的列表,是使用一组可见值,您检查这些值以在浏览项目时进行过滤和扩充:
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) )