在列表中的元组的索引[0]处复制,比较重复项的值,返回具有最小值的重复列表

时间:2018-06-12 12:58:35

标签: python list duplicates compare

我目前有一个元组列表,语法如下:

List = [(FID, LEVEL, REL_SIZE),(FID, LEVEL, REL_SIZE), ...]

例如:

List = [(22, 0, 40.210), (23, 0, 43.193), (23, 1, 80.867), (40, -1, 32.159), (40, 0, 50.408)]

我的python代码需要的是找到所有重复的FID(索引0),从重复项中比较REL_SIZE(索引2)并在新列表中返回具有REL_SIZE最低值的元组。

所以作为上述例子的回报:

New_list = [(23, 0, 43.193), (40, -1, 32.159)]

2 个答案:

答案 0 :(得分:1)

使用itertools.groupby()

from itertools import groupby
List = [(22, 0, 40.210), (23, 0, 43.193), (23, 1, 80.867), 
        (40, -1, 32.159), (40, 0, 50.408)]

groups = [list(g) for _,g in groupby(sorted(List), key=lambda t:t[0])]
x = [min(g, key=lambda t:t[2]) for g in groups if len(g) > 1]

产地:

[(23, 0, 43.193), (40, -1, 32.159)]

编辑:您的澄清评论会增加皱纹。这将包括(22,...)元组,即使没有重复。已修复。

答案 1 :(得分:1)

我们将使用字典按FID对元组进行分组。然后我们回顾那个字典的值,并采用具有多个元组的最小REL_SIZE。

from collections import defaultdict
from operator import itemgetter

l = [(22, 0, 40.210), (23, 0, 43.193), (23, 1, 80.867), (40, -1, 32.159), (40, 0, 50.408)]

d = defaultdict(list)
for t in l:
    d[t[0]].append(t)

print([min(tups, key=itemgetter(2)) for tups in d.values() if len(tups) > 1])
# [(40, -1, 32.159), (23, 0, 43.193)]

此方法的缺点是您可能会丢失输入列表的顺序,具体取决于您使用的Python版本。