python中的元组比较和排序

mfuanj7w  于 2023-05-12  发布在  Python
关注(0)|答案(2)|浏览(102)

我遇到的问题很难用一般的方式描述,所以我描述了实际的问题。
我在一个图像中有一些点,它们有一个特定的ID,而我在另一个图像中有大量的点,有些具有相同的ID,我想链接到第一个图像中的点。链接应该在元组中的位置上。ID1不一定要在位置1,但对应的点应该在两个元组中的相同位置。

ID1 = (1, 2, 3, 4)
ID2 = (5, 3, 1, 2, 4)

points1= ((1,2), (1, 4), (3,5), (7,8))
points2= ((1,3), (2, 4), (2,5), (4,8), (3,9))

我需要的是一个排序后的输出,如下所示

points_1_outpout = ((1,2), (1, 4), (3,5), (7,8))
points_2_output =  ((2,5), (4, 8), (2,4), (3,9))

如cow所愿我所做的是:(而且它很丑,而且不能真正工作,因为我不能期望没有“洞”就有越来越多的ID)

import numpy as np

ID1 = (1, 2, 3, 4)
ID2 = (5, 3, 1, 2, 4)

ID1 = np.asarray(ID1)
Id2 = np.asarray(ID2)

points1= ((1,2), (1, 4), (3,5), (7,8))
points2= ((1,3), (2, 4), (2,5), (4,8), (3,9))

points1 = np.asarray(points1)
points2 = np.asarray(points2)

##points_1_outpout = ((1,2), (1, 4), (3,5), (7,8))
###points_2_output =  ((2,5), (4, 8), (2,4), (3,9))

ID1sort, Corner1sort = zip(*sorted(zip(ID1, points1)))
ID2sort, Corner2sort = zip(*sorted(zip(ID2, points2)))
vlju58qv

vlju58qv1#

ID1 = (1, 2, 3, 4)
ID2 = (5, 3, 1, 2, 4)

points1 = ((1, 2), (1, 4), (3, 5), (7, 8))
points2 = ((1, 3), (2, 4), (2, 5), (4, 8), (3, 9))

def resolve(ids, points):
    return tuple(map(lambda x: x[1], sorted(zip(ids, points))))
 
 
print(resolve(ID1, points1))
print(resolve(ID2, points2))

您可以使用zip将id与点匹配,然后允许元组排序对它们进行正确排序。
Map用于删除输出的订单ID。

dphi5xsq

dphi5xsq2#

可能不是最佳的,但你可以这样做:

d1 = dict(sorted(zip(ID1, points1)))
d2 = dict(sorted(zip(ID2, points2)))
keys = set(d1).intersection(d2)
out1 = [v for k, v in d1.items() if k in keys]
out2 = [v for k, v in d2.items() if k in keys]

输出:

>>> out1
[(1, 2), (1, 4), (3, 5), (7, 8)]

>>> out2
[(2, 5), (4, 8), (2, 4), (3, 9)]

如果使用Pandas

import pandas as pd

sr1 = pd.Series(points1, index=ID1, name='P1')
sr2 = pd.Series(points2, index=ID2, name='P2')
out = pd.concat([sr1, sr2], axis=1).dropna().to_dict('list')

输出:

>>> out
{'P1': [(1, 2), (1, 4), (3, 5), (7, 8)],
 'P2': [(2, 5), (4, 8), (2, 4), (3, 9)]}

相关问题