首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列表中具有权重的字母重复组合

列表中具有权重的字母重复组合
EN

Stack Overflow用户
提问于 2017-12-07 08:15:01
回答 4查看 312关注 0票数 0

我有四个字母有不同的重量

代码语言:javascript
运行
复制
letters = ['C', 'N', 'O', 'S']
weights_of_l = [1, 1, 2, 2]

我想得到字母的组合,其中的weight = 2。这封信可以反复挑选,顺序也不重要。结果可以是列表或数组,也可以是任何窗体,但可以使用此组合。

代码语言:javascript
运行
复制
comb_w2 = ['CC','NN','NC','O','S']

在这里,CNweight = 1,所以组合两个字母有weight = 2:可能的组合是'CC','NN','NC'

OS已经有了weight = 2,所以不能与其他字母结合。有计算这个的库吗?我看到了itertools,但它只给出了可能性的数量,而没有给出组合。

EN

回答 4

Stack Overflow用户

发布于 2017-12-07 08:38:35

你的问题是分区 (不容易)。您可以使用 post为给定的权重生成所有可能的组合结果。然后,您可以删除包含在weights_of_l中没有的键的那些。最后,用字母替换数字,并为具有相同权重的字母创建排列。

票数 2
EN

Stack Overflow用户

发布于 2017-12-07 08:54:24

@Sneha有一个很好且简洁的答案,但是如果你要有很多组合,那么最好不要在创建组合方面走得太远。此解决方案更长,但对于目标得分较高的长字母列表,运行速度更快:

代码语言:javascript
运行
复制
letters = ['C', 'N', 'O', 'S']
weights_of_l = [1, 1, 2, 2]

def get_combos(letters, weights, goal):
    weighted_letters = list(zip(letters, weights))
    combos = set()

    def get_combos(letters, weight):
        for letter, next_weight in weighted_letters:
            total = weight + next_weight
            if total == goal:
                combos.add(''.join(sorted(letters + letter)))
            elif total > goal:
                pass
            else:
                get_combos(letters + letter, weight+next_weight)

    get_combos('',0)
    return combos

print(get_combos(letters, weights_of_l, 3))

编辑:我认为这个可能会更快:

代码语言:javascript
运行
复制
letters = ['C', 'N', 'O', 'S']
weights_of_l = [1, 1, 2, 2]

def get_combos(letters, weights, goal):
    weighted_letters = sorted(zip(weights, letters))
    combos = []

    def get_combos(letters, weight, weighted_letters):
        for i, (next_weight, letter) in enumerate(weighted_letters):
            total = weight + next_weight
            if total == goal:
                combos.append(letters + letter)
            elif total > goal:
                return
            else:
                get_combos(letters+letter, weight+next_weight, weighted_letters[i:])

    get_combos('',0,weighted_letters)
    return combos

print(get_combos(letters, weights_of_l, 3))
票数 1
EN

Stack Overflow用户

发布于 2017-12-07 08:35:23

创建字母的所有组合,并使用筛选函数删除不等于2的所有组合。

代码语言:javascript
运行
复制
from itertools import combinations_with_replacement
letters = ['C', 'N', 'O', 'S']
weights_of_l = [1, 1, 2, 2]
y=dict(zip(letters,weights_of_l))   #Creates a dict of the two list letters 
#and weights_of_l
print(list(map(lambda x:''.join(x),filter(lambda 
x:y[x[0]]+y[x[1]]==2,combinations_with_replacement(letters,2)))))

或者,您可以首先筛选字母列表中的所有字母,以包括重量小于2或所需重量的字母,然后创建所有组合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47690463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档