有没有更好的方法在Python中找到2d数组中的唯一最大值?

时间:2016-02-25 16:26:24

标签: python sorting multidimensional-array max

我有一个二维数组,看起来像这样:

import pprint
import jellyfish

data = [['', 'Sir', 'Arthur', 'Of', 'Camelot'],
        ['Sir', None, None, None, None],
        ['Amel', None, None, None, None],
        ['Of', None, None, None, None],
        ['Camelot', None, None, None, None],
        ['Art', None, None, None, None],
        ['Sir', None, None, None, None],
        ]

for i, name in enumerate(data[0][1:]):
    for others in data[1:]:
        others[i+1] = jellyfish.jaro_winkler(others[0], name)

for i, row in enumerate(data):
    if i < 1:
        print(('{:<8}'*5).format(*row))
    else:
        print(('{:<8}'+'{:<8.1f}'*4).format(*row))

输出

        Sir     Arthur  Of      Camelot 
Sir     1.0     0.5     0.0     0.0     
Amel    0.0     0.5     0.0     0.7     
Of      0.0     0.0     1.0     0.0     
Camelot 0.0     0.0     0.0     1.0     
Art     0.0     0.8     0.0     0.0  
Sir     1.0     0.5     0.0     0.0     

我正在寻找的是独特的最大值。例如,在这种情况下,我希望看到类似的内容:

[Match(this_name='Sir', that_name='Sir', score=1.0),
 Match(this_name='Of', that_name='Of', score=1.0),
 Match(this_name='Camelot', that_name='Camelot', score=1.0),
 Match(this_name='Art', that_name='Arthur', score=0.8),
 ]

请注意,Amel和第二个Sir丢失了。如果我要写出这个过程,它看起来像这样:

  • 寻找最高分(在我们的例子中,有4 1.0个,所以我们只需要第一个 - SirSir
  • 删除行和列
  • 找到下一个最高分(Of和`Of)。
  • 删除行和列
  • 找到下一个最高分(CamelotCamelot
  • 删除行和列
  • 找到下一个最高分(ArtArthur
  • 删除行和列
  • 没有列,我们已完成\ o /

我已经写了一个这样的递归形式,但是看起来很笨拙。可能只是因为 是解决问题的最佳方法,它只是感觉很尴尬。在很大程度上,我认为这是由于一些限制:

  • 任何(或两者)行或列可以多次具有相同的名称
  • 行中的一个名称只能对应列中的一个名称
    • 我没有在此处表示,但您可能在行(或列)中有两个相同的名称映射到不同的名称。例如,如果ArtAmel已消失,则第二个Sir将映射到Arthur,因此我不认为这样做会很简单(例如你有两个[或N] (1.0, 'Sir', 'Sir'))。

有没有更好的方法来解决我的问题?

0 个答案:

没有答案