无重复的组合/排列跨分组
我在找C语言或Python代码来实现下面这两个伪代码函数:
function 1:
list1 = [0,1,2] #any list of single-integer elements
list2 = [0,3,4]
list3 = [0,2,4]
function1(list1, list2, list3)
>>> (0,3,2),(0,3,4),(0,4,2),(1,0,2),(1,0,4),(1,3,0),(1,3,2),(1,3,4),
(1,4,0),(1,4,2),(2,0,4),(2,3,0),(2,3,4),(2,4,0)
简单来说,就是生成所有有效的排列,要求是a) 每个列表中选一个元素,b) 选出的元素不能有重复的值。
function 2:
list1 = [(0,1),(0,2),(0,3)] #any list of double-integer tuples
list2 = [(0,4),(1,4),(2,4)]
function2(list1, list2)
>>> ((0,1),(2,4)) , ((0,2),(1,4)) , ((0,3),(1,4)) , ((0,3),(2,4))
函数2生成的排列是从每个列表中选一个元组,并且每个元组内部的元素不能重复。
我查看了Python的itertools帮助文档,但没找到能实现这些伪函数的内容。有没有什么建议?
谢谢,
Mike
5 个回答
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续运行。
比如说,如果你在做一个游戏,可能会有这样的规则:只有当玩家的分数超过100分时,才能进入下一关。这种情况下,我们就需要用到“条件语句”。条件语句就像是一个检查点,程序会在这里停下来,看看条件是否成立。
如果条件成立,程序就会执行接下来的代码;如果不成立,程序就会跳过这些代码,继续执行其他部分。
这样做的好处是,我们可以让程序更加灵活,能够根据不同的情况做出不同的反应。就像生活中,我们也会根据情况做出不同的决定一样。
希望这个解释能帮助你理解条件语句的基本概念!
def f2(first, second):
for a in first:
for b in second:
if len(set(a + b)) == 4:
yield (a, b)
Pär Wieslander 提供了一个很好的通用解决方案来处理 function1。这里是一个通用的解决方案来处理 function2。
from itertools import product
def function2(*args):
return [i for i in product(*args) if (lambda x: len(x) == len(set(x)))([k for j in i for k in j])]
当然,如果你觉得返回一个生成器表达式更符合你的需求,也是可以的。
比如说:
def function2(*args):
return (i for i in product(*args) if (lambda x: len(x) == len(set(x)))([k for j in i for k in j]))
这段代码的意思是……
首先,它定义了一个变量,这个变量可以用来存储信息。接着,它可能会进行一些操作,比如计算或者判断条件。最后,代码会输出结果,告诉我们计算的结果是什么。
在编程中,变量就像一个盒子,我们可以把东西放进去,也可以随时拿出来查看或者修改。操作就像是对这些东西进行处理,比如加减乘除,或者检查某个条件是否成立。
总之,这段代码的主要目的是为了完成某个特定的任务,帮助我们解决问题。
from itertools import product
def function1(*seqs):
return (x for x in product(*seqs) if len(x) == len(set(x)))
>>> list(function1([0,1,2], [0,3,4], [0,2,4]))
[(0, 3, 2), (0, 3, 4), (0, 4, 2), (1, 0, 2), (1, 0, 4), (1, 3, 0), (1, 3, 2), (1, 3, 4), (1, 4, 0), (1, 4, 2), (2, 0, 4), (2, 3, 0), (2, 3, 4), (2, 4, 0)]