生成所有排列,包括带有权重的缩写

2024-09-26 18:02:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我的绳子-

name_target = "ARUN GULABRAO INDULKAR"

我想用原始名称和缩写生成所有排列,并为每个排列分配权重-

[ARUNGULABRAOINDULKAR, 1]
[ARUNGINDULKAR, 0.9]
[ARUNGULABRAOI, 0.9]
[AGULABRAOINDULKAR, 0.9]
[ARUNGI, 0.8]
[AGINDULKAR, 0.8]
[AGULABRAOI, 0.8]
[ARUNINDULKARGULABRAO, 1]
[ARUNIGULABRAO, 0.9]
[ARUNINDULKARG, 0.9]
[AINDULKARGULABRAO, 0.9]
[ARUNIG, 0.8]
[AIGULABRAO, 0.8]
[AINDULKARG, 0.8]
[GULABRAOARUNINDULKAR, 1]
[GULABRAOAINDULKAR, 0.9]
[GULABRAOARUNI, 0.9]
[GARUNINDULKAR, 0.9]
[GULABRAOAI, 0.8]
[GAINDULKAR, 0.8]
[GARUNI, 0.8]
[GULABRAOINDULKARARUN, 1]
[GULABRAOIARUN, 0.9]
[GULABRAOINDULKARA, 0.9]
[GINDULKARARUN, 0.9]
[GULABRAOIA, 0.8]
[GIARUN, 0.8]
[GINDULKARA, 0.8]
[INDULKARARUNGULABRAO, 1]
[INDULKARAGULABRAO, 0.9]
[INDULKARARUNG, 0.9]
[IARUNGULABRAO, 0.9]
[INDULKARAG, 0.8]
[IAGULABRAO, 0.8]
[IARUNG, 0.8]
[INDULKARGULABRAOARUN, 1]
[INDULKARGARUN, 0.9]
[INDULKARGULABRAOA, 0.9]
[IGULABRAOARUN, 0.9]
[INDULKARGA, 0.8]
[IGARUN, 0.8]
[IGULABRAOA, 0.8]

不关心这个输出数据结构,它可以是任何东西。如果没有使用缩写和全名,则权重为1

如果使用缩写,重量将减少10%。例如,第二个输出行中的ARUNGINDULKAR得到了0.9,因为中间名被缩写了ARUNGI 得到了0.8,因为中间名和姓氏被缩写了

我已经有效地使用了itertools.permutations(name_target)来生成第一组置换

我不知道如何组合这些缩写^当被' '分割时,{}可以是可变长度的

请忽略预期输出中的重复项


Tags: name名称target权重绳子arunarungiagulabraoi
1条回答
网友
1楼 · 发布于 2024-09-26 18:02:55

您可以将递归与生成器一起使用来构建名称缩写组合itertools.permutations还用于创建原始输入名称的所有可能顺序,并且这些全名组合中的每一个都传递给get_combos,在那里生成缩写组合。布尔标志(True表示全名,False表示缩写)与get_combos中生成的每个名称组件相关联,允许计算权重:

from itertools import permutations as prmt
def get_combos(d, l, c = []):
   if d:
      yield from get_combos(d[1:], l, c+[(d[0], True)])
      if sum(not b for _, b in c) + 1 < l:
         yield from get_combos(d[1:], l, c+[(d[0][0], False)])
   else:
      yield [''.join(a for a, _ in c), 1-sum(0.1 for _, b in c if not b)]

name_target = "ARUN GULABRAO INDULKAR"
n = name_target.split()
l = len(n)
result = [i for b in prmt(n, l) for i in get_combos(b, l)]

输出:

[['ARUNGULABRAOINDULKAR', 1], ['ARUNGULABRAOI', 0.9], ['ARUNGINDULKAR', 0.9], ['ARUNGI', 0.8], ['AGULABRAOINDULKAR', 0.9], ['AGULABRAOI', 0.8], ['AGINDULKAR', 0.8], ['ARUNINDULKARGULABRAO', 1], ['ARUNINDULKARG', 0.9], ['ARUNIGULABRAO', 0.9], ['ARUNIG', 0.8], ['AINDULKARGULABRAO', 0.9], ['AINDULKARG', 0.8], ['AIGULABRAO', 0.8], ['GULABRAOARUNINDULKAR', 1], ['GULABRAOARUNI', 0.9], ['GULABRAOAINDULKAR', 0.9], ['GULABRAOAI', 0.8], ['GARUNINDULKAR', 0.9], ['GARUNI', 0.8], ['GAINDULKAR', 0.8], ['GULABRAOINDULKARARUN', 1], ['GULABRAOINDULKARA', 0.9], ['GULABRAOIARUN', 0.9], ['GULABRAOIA', 0.8], ['GINDULKARARUN', 0.9], ['GINDULKARA', 0.8], ['GIARUN', 0.8], ['INDULKARARUNGULABRAO', 1], ['INDULKARARUNG', 0.9], ['INDULKARAGULABRAO', 0.9], ['INDULKARAG', 0.8], ['IARUNGULABRAO', 0.9], ['IARUNG', 0.8], ['IAGULABRAO', 0.8], ['INDULKARGULABRAOARUN', 1], ['INDULKARGULABRAOA', 0.9], ['INDULKARGARUN', 0.9], ['INDULKARGA', 0.8], ['IGULABRAOARUN', 0.9], ['IGULABRAOA', 0.8], ['IGARUN', 0.8]]

相关问题 更多 >

    热门问题