Python 如何通过避免特定类型的组合使用itertools.combinations_和_替换

Python 如何通过避免特定类型的组合使用itertools.combinations_和_替换,python,itertools,Python,Itertools,我如何使用 itertools.combinations_与_替换 通过省略某些特定类型的组合。在这种情况下 列表(组合_与_替换([1,2,3,4,3])) 我需要避免(1,1,1),(2,2,2),(3,3,3),(4,4,4),把剩下的都留下。 是一个很好的参考,但我找不到我需要的 您可以结合一个简单的函数: combinations = combinations_with_replacement([1, 2, 3, 4], 3) filtered = filter(lambda c: l

我如何使用

itertools.combinations_与_替换

通过省略某些特定类型的组合。在这种情况下

列表(组合_与_替换([1,2,3,4,3]))

我需要避免(1,1,1),(2,2,2),(3,3,3),(4,4,4),把剩下的都留下。 是一个很好的参考,但我找不到我需要的

您可以结合一个简单的函数:

combinations = combinations_with_replacement([1, 2, 3, 4], 3)
filtered = filter(lambda c: len(set(c)) > 1, combinations)
您负责选择应过滤或不过滤哪些组合。此处使用lambda函数:如果所有元素都相同,则丢弃它。

您可以与一个简单函数组合:

combinations = combinations_with_replacement([1, 2, 3, 4], 3)
filtered = filter(lambda c: len(set(c)) > 1, combinations)

您负责选择应过滤或不过滤哪些组合。这里使用lambda函数:如果所有元素都相同,则丢弃它。

如果输入列表已排序或包含不同的元素,这也将产生预期的结果:

combinations = combinations_with_replacement([1, 2, 3, 4], 3)
filtered = (c for c in combinations if c[0] != c[-1])  # Use square brackets if a list is needed

该解决方案之所以有效,是因为在每个生成的组合元组中,元素都是根据其在输入列表中的索引进行排序的。因此,如果
c[0]==c[-1]
,则对于任何元素
e
,如果对输入列表进行排序或包含不同的元素,则
索引(c[0]),这也将产生预期的结果:

combinations = combinations_with_replacement([1, 2, 3, 4], 3)
filtered = (c for c in combinations if c[0] != c[-1])  # Use square brackets if a list is needed

该解决方案之所以有效,是因为在每个生成的组合元组中,元素都是根据其在输入列表中的索引进行排序的。因此,如果
c[0]==c[-1]
,那么对于
e
这样的任何元素
索引(c[0]),它都能工作,并且给出了我所需要的,谢谢!!但是我不知道它是如何工作的,我在哪里可以读到关于这个过滤器的内容?@kalinfirst你可以看看我链接的文档页面。基本上,
filter()
需要两个参数。第一个是一个函数,如果元素被接受,则返回
True
,如果元素被丢弃,则返回
False
。第二个参数是应该应用过滤函数的元素列表。事实上,我的问题应该是为什么“len(set(c))>1”删除三元组combinations@kalinfirst哦,对不起。因此,例如,如果
c==(1,2,3)
那么
set(c)={1,2,3}
len(set(c))==3
,那么这个组合如果被接受。但是,如果
c==(1,1,1)
那么
set(c)=={1}
就被丢弃了。集合是存储彼此不同元素的非有序数据结构。一旦组合
(1,1,1)
被转换成一个集合
{1}
,就很容易看出组合的所有元素是否都是相同的。它可以工作,并且提供了我所需要的,谢谢!!但是我不知道它是如何工作的,我在哪里可以读到关于这个过滤器的内容?@kalinfirst你可以看看我链接的文档页面。基本上,
filter()
需要两个参数。第一个是一个函数,如果元素被接受,则返回
True
,如果元素被丢弃,则返回
False
。第二个参数是应该应用过滤函数的元素列表。事实上,我的问题应该是为什么“len(set(c))>1”删除三元组combinations@kalinfirst哦,对不起。因此,例如,如果
c==(1,2,3)
那么
set(c)={1,2,3}
len(set(c))==3
,那么这个组合如果被接受。但是,如果
c==(1,1,1)
那么
set(c)=={1}
就被丢弃了。集合是存储彼此不同元素的非有序数据结构。一旦组合
(1,1,1)
转换为一个集合
{1}
,就很容易看出组合的所有元素是否相同。谢谢。这也行得通。我也不知道为什么:-(我添加了一个解释。谢谢。这也有效。我也不知道为什么:-(我添加了一个解释)。