我目前有一个元组列表,语法如下:
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)]
答案 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版本。