【发布时间】:2020-12-20 23:57:18
【问题描述】:
我想通过过滤删除列表中先前类别中的残留类别。 我已经尝试解决这个问题几天了,但我无法让它工作。
我知道使用列表进行过滤,但是我也需要生成列表,我希望通过过滤来做到这一点。
我从一个空列表开始,只有在符合特定标准时才向其中添加元素。这似乎适用于 h(z) 的前几个值,但对于较大的值则失败,我不知道为什么。
[x,y]表示y模x的余类。
起初我有兴趣找到,对于 2 的某个幂,x=pow(2,w),所有奇数 y<x,使得 [x,y]>g(x,y)。 g(x,y) 定义如下。
没有辨别力我得到:
[4,1],[8,5],[16, 1],[16,3],[16, 5],[16, 13],[32, 1],[32, 3],[32, 5],[32, 11],[32, 13],[32, 17],[32, 19],[32, 21],[32, 23],[32, 25],[32, 29]...
但我意识到我不需要每个输出,因为许多残留类都在前一个中。
随着元组列表的增长,如果下一个要添加到列表中的残留类在列表中的任何残留类中,我需要消除它们。
我不需要[8,5],因为5%4==1、[8,5] 在[4,1] 内部,同样我也不需要[16,1],[16,5] 或[16,13]。
[4,1],[16,3],[32, 11],[32, 23],...
过去x=32,我需要消除奇数y%4==1,y%16==3,y%32==1,y%32==23。
def g(x,y):
while x%2!=1:
if (x%2==0 and y%2==1):
x=(3/2)*x
y=(3*y+1)/2
while (x%2==0 and y%2==0):
x=x/2
y=y/2
return [int(x),int(y)]
def h(z):
requirements=[]
for integer in range(1,z+1):
x=pow(2,integer)
residuelist=range(1,x+1)
for z in requirements:
for a,b in z:
residuelist=filter(lambda x: x%a!=b,residuelist)
residuelist=list(residuelist)
for y in residuelist:
if y%2==1:
if [x,y]>g(x,y):
requirements.append((x,y))
return requirements
h 似乎适用于z=2,3,4:
h(2)
[[(4, 1)]]
h(3)
[[(4, 1)]]
h(4)
[[(4, 1)], [(16, 3)]]
但是过了z=5,出了点问题
h(5) 应该是
[[(4,1)],[(16,3)],[(32, 11)],[(32, 23)]]
但我得到了:
[[(4, 1)], [(16, 3)], [(32, 1)], [(32, 5)], [(32, 11)], [(32, 13)], [(32, 17)], [(32, 21)], [(32, 23)], [(32, 25)], [(32, 29)]].
我不知道发生了什么,因为h(4) 附加了正确的元组,所以如果过滤器正常工作,那么[(32,1)] 不应该像许多其他人一样在那里?将两个项目附加到 requirements 后,迭代中出现问题。
【问题讨论】:
-
您正在添加额外级别的列表。所以不是
[(4, 1)]你会返回[[(4, 1]]] -
应该是
requirements.append((x,y)) -
我得到 TypeError: cannot unpack non-iterable int object
-
你的代码真的很难理解所有那些毫无意义的 1 字母函数和变量名称。
-
我一开始试过,但 h 只适用于 h(2)
标签: python python-3.x tuples filtering