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



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

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

使用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,...( 元组,即使没有重复项。固定。

我们将使用字典按 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 版本。

最新更新