【问题标题】:Is it possible to generate a list through filtering?是否可以通过过滤生成列表?
【发布时间】: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


【解决方案1】:

您将元组包装在额外级别的列表中。追加时不需要将(x, y) 包裹在[] 中,然后只需要对requirements 进行一级循环。

def h(z):
    requirements=[]
    for w in range(1,z+1):
        x=pow(2,w)
        v=range(1,x+1)
        for a, b in requirements:
            v=filter(lambda x: x%a!=b, v)
        v=list(v)
        for y in v:
            if y%2==1:
                if [x,y]>g(x,y):
                    requirements.append((x,y))
    return requirements

这对z=2, 3, 4 来说不是问题,因为最后的循环仅在最后一次迭代时附加到requirements,因此for z in requirements 循环从未执行。

【讨论】:

  • h(5) 仍然产生与上面相同的输出,只是元组没有包含在[] 方括号中,这是我编写代码时的第一次尝试
  • 我真的不明白你在做什么的数学。当x=32v = [2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 28, 30, 31, 32]。这是正确的吗?
  • 那时requirements = [(4, 1)]。将打印语句添加到您的代码中,以查看不同位置的变量,看看哪些地方不是您所期望的。
  • 唯一被过滤掉的值都是4n+1个值。
  • 是的!但我只对 v= [2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 28, 30, 31, 32] 中的 y 感兴趣,它们是奇怪的 (%2==1)[x,y]>g(x,y) 所以它应该是第一个 v-odd = [ 3, 7,11, 15, 19, 23, 27, 31 ] (所有奇数减少),然后 y=11,23 因为这些是 y 的唯一值满足 [x,y]>g(x,y)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2012-07-12
  • 2018-02-12
  • 2015-10-19
相关资源
最近更新 更多