内置工具,用于根据[1,2,…,n]上的分级快速提取给定等级的元组

2024-09-26 18:11:23 发布

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

我正在编写2个数学组合运算的代码,我希望迭代(尽可能)多次,因此速度显然至关重要

这里是一个例子,我想做什么,尽快和有效地为任何正整数n和任何分级(见下面的例子)

备注:这是一个来自Sage数学实验的自我激励问题。 非常感谢你的帮助

示例: 让我们取n=6,集S={1,2,…,n}={1,2,3,4,5,6}。 有二项式(6,2)=15对

[(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 3), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6), (4, 5), (4, 6), (5, 6)]

我们可以从S。 为了获得上述列表,建议我使用的内置工具如下:

from itertools import combinations
n = 6
iterable = list(range(1, n+1))
r = 2
print(list(combinations(iterable, r)))

问题0:Python有更快的版本吗

现在让我在集合S上选择一个从S到{1,2,3}的函数形式的分级

评分:1、2、3-->;1和4,5-->;2和6-->;三,

我已决定将此函数存储为字典,如下所示:

grading = {1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 3}

关于这个等级,我们可以计算由S构造的元素、偶或元组的等级

示例:

  • 职系(2)=1
  • 职系(5)=2
  • 等级((2,5))=等级(2)+等级(5)=1+2=3
  • 等级((2,3,5))=1+1+2=5

1-首次施工:

我要所有成绩等于g0=4的夫妇。 下面是一个显而易见的方法,它是在前面几行代码的基础上天真地构建的:

g0 = 4
gradedList = []
for couple in list(combinations(iterable, 2)):
    grade = grading[couple[0]] + grading[couple[1]]
    if grade == g0:
        gradedList.append(couple)
print(gradedList)

这就产生了

[(1, 6), (2, 6), (3, 6), (4, 5)]

如所愿

问题1:是否有一种内置的方式来获取gradedList和/或用Python实现这一点的最快方式是什么

2-第二次施工:

现在我想提取所有递增的3元组(I,j,k),等级等于4,并且从I=1开始

换言之,我想要以下列表:

[(1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5)]

当然,这可以通过以下方式获得:

newIterable = list(range(2, n+1))
secondGradedList = []
for couple in list(combinations(newIterable, 2)):
    grade = grading[1] + grading[couple[0]] + grading[couple[1]]
    if grade == g0:
        secondGradedList.append((1,) + couple)
print(secondGradedList)

问题2:是否有一种内置的方式来获取secondGradedList和/或用Python实现这一点的最快方式是什么

谢谢, 朱利安


Tags: 代码gt方式数学iterable内置listgrading

热门问题