Python 嵌套列表重复排序
考虑Python中的以下嵌套列表:Python 嵌套列表重复排序,python,list,Python,List,考虑Python中的以下嵌套列表: [ ['Val1',1',X'], ['Val2',1',X'], [Val2',2',Y'], [Val3',2',Y'], [Val4',2',Y'], ['Val4',3',Z'], [Val5',3',Z'], ['Val6',3',Z'], ] 其中索引0处存在重复项。我想从这个列表中获得一个新的列表,删除重复的列表,并将值最高的列表保留在索引1中。在上述示例中,生成的列表应如下所示: [ ['Val1',1',X'], [Val2',2',Y']
[
['Val1',1',X'],
['Val2',1',X'],
[Val2',2',Y'],
[Val3',2',Y'],
[Val4',2',Y'],
['Val4',3',Z'],
[Val5',3',Z'],
['Val6',3',Z'],
]
其中索引0处存在重复项。我想从这个列表中获得一个新的列表,删除重复的列表,并将值最高的列表保留在索引1中。在上述示例中,生成的列表应如下所示:
[
['Val1',1',X'],
[Val2',2',Y'],
[Val3',2',Y'],
['Val4',3',Z'],
[Val5',3',Z'],
['Val6',3',Z'],
]
步骤1:根据第二个属性进行排序。
步骤2:根据第一个属性进行排序。
由于排序在python中是“稳定”的,因此在步骤2之后,将保留步骤1中排序的顺序
l = # list of similarly formatted lists
l = sorted(l, key=itemgetter(1))
l = sorted(l, key=itemgetter(0))
或者,编写自己的比较键函数。我认为这应该是可行的,因为元组是按从左到右的顺序进行比较的:
l = sorted(l, key=tuple)
使用熊猫
x = [['Val1', 1, 'X'],
['Val2', 1, 'X'],
['Val2', 2, 'Y'],
['Val3', 2, 'Y'],
['Val4', 2, 'Y'],
['Val4', 3, 'Z'],
['Val5', 3, 'Z'],
['Val6', 3, 'Z']]
import pandas as pd
pd.DataFrame(x).sort_values([0, 1]).drop_duplicates(subset=[0], keep='last').values.tolist()
谢谢,这正是我想要的。为了我的教育,你能把这行代码分解一下,解释一下它在做什么吗?@Cory如果我错了,请纠正我。这里您首先使用i[0]进行分组,它将给出索引1的唯一值,即Val1、Val2、Val3。由于您使用的是max(g,key=lambda i:i[1]),因此您使程序按具有最高索引1的via值(val1,val2,val3)进行分组更新:我遇到了一个问题,该方法不会弹出DUP,除非它先按索引[0]排序。例如,如果输入列表有Val1、Val2、Val1,则不会抛出dup Val1。对列表排序首先解决了以下问题:语句keep='last'和subset=[0]做什么。另外,.values.tolist()将其转换回我相信的列表?首先我按第一列和第二列排序,然后在存在重复项时选择最后一列(对应于第二列的最大值)
x = [['Val1', 1, 'X'],
['Val2', 1, 'X'],
['Val2', 2, 'Y'],
['Val3', 2, 'Y'],
['Val4', 2, 'Y'],
['Val4', 3, 'Z'],
['Val5', 3, 'Z'],
['Val6', 3, 'Z']]
import pandas as pd
pd.DataFrame(x).sort_values([0, 1]).drop_duplicates(subset=[0], keep='last').values.tolist()