Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 嵌套列表重复排序_Python_List - Fatal编程技术网

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']

考虑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'],
[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()