Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据条件排除itertools置换的某些结果?_Python_Permutation - Fatal编程技术网

Python 如何根据条件排除itertools置换的某些结果?

Python 如何根据条件排除itertools置换的某些结果?,python,permutation,Python,Permutation,我正试图从罗莎琳那里解决这个问题 Return:长度为n的有符号排列的总数,后跟 所有此类排列(您可以按任何顺序列出签名排列) 我有一个Python解决方案的想法,但我无法将其实现到底。例如,考虑n=2。 numbers = [1, -1, 2, -2] ordering = permutations(numbers,n) 因此,现在我得到了一些元组: (1,-1)(1,2)(1,-2)(-1,1)(-1,2)(-1,2)(2,1)(2,-1)(2,-2)(-2,1) (-2,

我正试图从罗莎琳那里解决这个问题

Return:长度为n的有符号排列的总数,后跟 所有此类排列(您可以按任何顺序列出签名排列)

我有一个Python解决方案的想法,但我无法将其实现到底。例如,考虑n=2。

    numbers = [1, -1, 2, -2]
    ordering = permutations(numbers,n)
因此,现在我得到了一些元组:

(1,-1)(1,2)(1,-2)(-1,1)(-1,2)(-1,2)(2,1)(2,-1)(2,-2)(-2,1) (-2,-1)(-2,2)


我需要排除那些具有相等模数的元素。例如,(-1,1)。是否可以实现此功能,如果可能,如何实现?

您可能正在寻找
过滤器功能

list(过滤器(lambda对:abs(对[0])!=abs(对[1]),排序))

条件可能是错误的,我不确定您所说的等模是什么意思。

您可能正在寻找
过滤器
函数

list(过滤器(lambda对:abs(对[0])!=abs(对[1]),排序))
条件可能是错误的,我不确定你所说的等模量是什么意思。

使用列表理解的pythonic解决方案:

filtered_perms = [(x,y) for x,y in ordering if abs(x) != abs(y)] 
编辑: 适用于python 3.7的代码:

import itertools as itt

# create permutation generator object
perms = itt.permutations([-2, -1, 1, 2], 2)  

# here generator is turned into a list with certain permutations excluded
filtered_perms = [(x,y) for x,y in perms if abs(x) != abs(y)]

# print whole list
print(filtered_perms) 

# print first permutation
print(filtered_perms[0])

# print length of the list
print(len(filtered_perms))
编辑2: 要解决排序中没有元素的问题,请执行以下操作:

ordering = list(itertools.permutations([-2, -1, 1, 2],2))
之后,排序将是来自
itertools的所有元素的列表。排列

使用列表理解的pythonic解决方案:

filtered_perms = [(x,y) for x,y in ordering if abs(x) != abs(y)] 
编辑: 适用于python 3.7的代码:

import itertools as itt

# create permutation generator object
perms = itt.permutations([-2, -1, 1, 2], 2)  

# here generator is turned into a list with certain permutations excluded
filtered_perms = [(x,y) for x,y in perms if abs(x) != abs(y)]

# print whole list
print(filtered_perms) 

# print first permutation
print(filtered_perms[0])

# print length of the list
print(len(filtered_perms))
编辑2: 要解决排序中没有元素的问题,请执行以下操作:

ordering = list(itertools.permutations([-2, -1, 1, 2],2))

在此之后,排序将是来自
itertools.permutations

的所有元素的列表。之前提出的解决方案是正确的,但是如果在生成置换后要处理结果列表,最好使用生成器而不是列表。为此,我建议您根据itertools.permutations设计自己的生成器函数:

def signed_permutations(iterable, r=2):
    for item in permutations(iterable, r):
        if abs(item[0]) != abs(item[1]):
            yield item
您可以将其用作:

for item in signed_permutations(numbers):
    do_something(item)
或者,如果您只想创建一个列表:

sigperm = list(signed_permutations(numbers))

之前提出的解决方案是正确的,但是如果在生成置换后要处理结果列表,最好使用生成器而不是列表。为此,我建议您根据itertools.permutations设计自己的生成器函数:

def signed_permutations(iterable, r=2):
    for item in permutations(iterable, r):
        if abs(item[0]) != abs(item[1]):
            yield item
您可以将其用作:

for item in signed_permutations(numbers):
    do_something(item)
或者,如果您只想创建一个列表:

sigperm = list(signed_permutations(numbers))

问题是itertools.permutation的工作结果并不完全是一个列表,因此像pair[1]这样调用项会产生TypeError:“itertools.permutations”对象不可调用。@michalwa:
==
在lambda中应该更改为
=以排除等模置换@AnastasiiaZakarian
itertools.permutation
返回精确的生成器。为什么以及如何调用
itertools.permutations
对象?@asikorski变量排序是itertools.permutations的结果。我不太熟悉生成器的工作方式,但是,据我所知,我不能,例如,在for循环中迭代它,并以这种方式打印或更改它的元素。我使用了
print(*ordering,sep=“”)
来查看它的工作结果,但这就是我的全部目的。@AnastasiiaZakarian我想你应该做的是正确地了解发电机的工作原理。您遇到的问题是您正在执行
print(*ordering,…)
。问题是itertools.permutation的工作结果不完全是一个列表,因此像pair[1]这样调用项会产生TypeError:“itertools.permutations”对象不可调用。@michalwa:
=
应该将lambda中的
更改为
=以排除等模置换@AnastasiiaZakarian
itertools.permutation
返回精确的生成器。为什么以及如何调用
itertools.permutations
对象?@asikorski变量排序是itertools.permutations的结果。我不太熟悉生成器的工作方式,但是,据我所知,我不能,例如,在for循环中迭代它,并以这种方式打印或更改它的元素。我使用了
print(*ordering,sep=“”)
来查看它的工作结果,但这就是我的全部目的。@AnastasiiaZakarian我想你应该做的是正确地了解发电机的工作原理。您遇到的问题是您正在执行
print(*ordering,…)
。这对我来说似乎是正确的解决方案。但它就是不起作用。当我在执行这行代码后调用filtered_perms变量时,我在输出中得到的是空列表。我想这也与itertools.permutation返回的变量类型有关。你说的“当我调用过滤的\u perms”是什么意思
filtered\u perms
是一个列表,可下标(
filtered\u perms[0]
),不可调用(
filtered\u perms(0)
)。如果你想访问
过滤的\u perms
元素,请使用方括号。另外:我建议用更多的代码更新你的帖子,因为我相信另一段代码中可能有错误。是的,
filtered\u perms
是一个列表,但我们正试图从
排序中创建它,而这不是一个列表,我认为它导致了所有的困难。事实上,除了导入库和输入变量之外,我的帖子中几乎有所有的代码。啊哈!问题是,您
打印(*排序)
,然后尝试创建
过滤的\u perms
,这是错误的<代码>*排序
导致获取生成器的所有元素
排序
。之后,
排序
将处于生成器不再产生任何值的状态。见我答案的第二部分。另外,请阅读有关迭代器和生成器的内容,这在将来可能会有所帮助。这对我来说似乎是正确的解决方案。但是