【问题标题】:Manipulating a list by dividing a number with all predecessors通过将数字与所有前任相除来操作列表
【发布时间】:2017-11-18 18:14:14
【问题描述】:

设置:python 3.6

我想创建列表并按数学规则过滤列表以找到素数。

第 1 部分:分配每个数字的平方根的函数

第 2 部分:创建列表并添加根为 %1 != 0 的数字。

第 3 部分:问题:计算每个值是否为质数。

如何完成第 3 部分: 取每个数字并将该数字除以所有作为前身的素数。只要不是 %1 == 0,数字就是质数。 而不是更进一步到列表中的下一个数字。

我真的很想这样做,以了解更多关于处理列表的方式。

结果只是最后的一个非常小的列表。

y = int(input("Please put the last number you want to now: \n"))
x = 1 #  0 is not valid by logic and 1 is not valid by definition
prims = []

# Part 1: Function: Calculate the square root (1)
def rootV(i):
    return math.sqrt(i)


# Part 2: Set the range of numbers and create the first list
for j in range(x, y):
j = int(j + 1)
c = rootV(j)

if c %1 == 0:
    continue
else:
    prims.append(j) # Liste der Wert gegeben
    print(prims)

# Part 3: Analyse every value by division with his predesessors
for i in prims:
    if len(prims) == 1:
    print("Very short list my friend: " + str(i))
    elif len(prims) > 1:
       for number in prims:
            lastNumber = len(prims) - 1
            firstNumber = 0
            value = prims[lastNumber] / prims[firstNumber]
            if value %1 == 0:
                prims.remove(lastNumber)
                continue
            else:
                continue

print(prims)

【问题讨论】:

  • 你在第一个 if "if len(prims) == 1:" 之后错过了一个标签,打印应该是标签。
  • 逻辑上也存在一些问题,在你已经进入 for 循环(在第 3 部分)之后,为什么还要检查列表的 len 是否等于 1。首先检查它,以节省运行时间。

标签: python python-3.x primes


【解决方案1】:

以下是我在您的代码中看到的问题:

  • 前两步去掉方块是不必要的,很好 素数查找算法无论如何都会对它们进行排序。

  • 您应该将除数测试限制为平方小于的除数 比(或等于)被测试的数字。而不是重复计算 正方形,我们可以在第一步中做一次,生成一个列表 数字和它们的正方形。

  • 您修改了您正在循环的列表,这是危险的。 如果我们让外循环遍历列表的副本并让 内部循环仅在循环结束时修改原始列表。

这是我的简化解决方案:

x, y = 1, 100

# Create list of numbers and their squares but numbers without an integer square root
pairs = [(j, j * j) for j in range(x + 1, y + 1)] # if (j ** 0.5) % 1 != 0]

# Calculate for each value whether its a prime number or not
for pair in list(pairs):  # walk over a *copy* of the pairs
    number, _ = pair

    # analyze every number by division with its predecessors
    for divisor, square in pairs:  # walk over the *original* pairs

        if square > number:  # finished testing
            break

        if number % divisor == 0:  # not a prime
            pairs.remove(pair)
            break

print(*(prime for prime, _ in pairs))

输出

> python3 test.py
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
>

您会注意到,如果您在推导式末尾删除 if (j ** 0.5) % 1 != 0 以允许正方形通过,则它对结果没有任何影响,因为主要测试逻辑会检测到它们。

您会进一步注意到,如果您将外部循环从 for pair in list(pairs): 更改为简单的 for pair in pairs:,它会崩溃并返回奇数,因为修改内部循环上的列表会影响外部循环。

【讨论】:

  • 我从你的例子中学到了很多。我有一个问题,我不知道 _ = pair 对中的影响如何。 number 好理解,但是为什么叫_=pair呢? number, _ = pair
  • @foriinlist,当我们实际上不需要该变量的值时,下划线 (_) 会替换该变量。 number, _ = pair 表示pair 包含两个东西,我只需要第一个。在这种情况下也可以写成number = pair[0],但在这种情况下不能写成:for prime, _ in pairs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2014-10-27
  • 1970-01-01
相关资源
最近更新 更多