python-3.x 循环元素到列表中

h5qlskok  于 2023-05-23  发布在  Python
关注(0)|答案(4)|浏览(222)

我试着列出99除以2的幂(2,4,8,16,32,64)的唯一余数,这些余数比99的余数小。代码如下:

num = 99
div = 2
lst = []

while div < num:
    r = num % div
    while r != 0 and r not in lst:
        lst.append(r)
    div = div * div
print(lst)`

我所使用的代码并没有为列表中的99%64追加余数,即35。程序输出:[一、三]
预期输出:[1,3,35]
我是一个完整的编程初学者,如果你能帮我找出正确的方法,我有问题,我会很感激。

kd3sttzy

kd3sttzy1#

您的div在每一步中递增为

0 ->2
1 -> 4 # 2*2
2 -> 16 # 4*4
3 -> 256 # 16 * 16

在步骤/循环3中,div值大于num,即256 > 99,因此程序在while循环中结束并退出,输出仅为[1, 3]
要解决这个问题,您需要将div的值增加2的倍数。下面是代码

>>> num = 99
>>> div = 2
>>> lst = []
>>> while div < num:
...     r = num%div
...     while r!=0 and r not in lst:
...             lst.append(r)
...     div = div *2
... 
>>> print(lst)
[1, 3, 35]

这里有一点性能更好的代码,可以使用set

>>> num = 99
>>> div = 2
>>> lst = set()
>>> 
>>> while div < num:
...     r = num%div
...     lst.add(r)
...     div = div*2
... 
>>> lst
{1, 3, 35}
>>> print(list(lst))
[1, 3, 35]
>>>

使用集合理解

from math import log, ceil
num = 99
result =  {num%(2**i) for i in range(1, ceil(log(num, 2)))}
print(result)
# {1,3,35}

使用集合理解,使用dict属性作为顺序

from math import log, ceil
num = 99
result =  {num%(2**i): 1 for i in range(1, ceil(log(num, 2)))}
print(result.keys())
# dict_keys([1, 3, 35]) # use list(result.keys()) to get output in list
bmvo0sr5

bmvo0sr52#

你的方式

添加一个变量来跟踪功率并在每个循环中递增:

num = 99
div = 2
power = 1
lst = []

while div < num:
    r = num % div
    while r != 0 and r not in lst:
        lst.append(r)
    power += 1 # Increment the power variable
    div = div ** up # Double asterisks is for the power operation
    print(div)
print(lst)

另一种方式

你也可以用一种更pythonic的方式来做。

  • 第一行,返回一个列表,所有2的幂都小于99
  • 第二行,将每个元素Map到它的剩余部分,将其转换为数据类型 set(以保留所有唯一的元素),最后将其转换为list。
a = [x for x in [2**p for p in range(1, 11)] if x < 99]
a = list(set(map(lambda x : 99 % x, a)))
print(a)

我不建议把它放在一行 * 像下面 *,因为你失去可读性。

a = list(set(map(lambda x : 99 % x, [x for x in [2**p for p in range(1, 11)] if x < 99]))) # Don't do it
monwx1rj

monwx1rj3#

您应该在一个集中构建唯一值的集合。最后对集合进行排序,根据需要给出输出

num = 99
unique = set()
div = 2

while div < num:
    unique.add(num%div)
    div *= 2

print(sorted(unique))
    • 输出:**
[1, 3, 35]
o4tp2gmn

o4tp2gmn4#

老实说,过度复杂化是最好的方法,真的很快就迷路了。

num = 99 
div = 2
power = 1
lst = []

while div < num:              # We only care about div values less than num
    div = div**power          # This incrementally raises div to the power exponent
    power += 1                # This will increment power by + 1 for each loop, other useful iterative operators are [-=,*=]
    lst.append(num % div)     # 'Appends*' the remainder of num/div to lst (*will add to the list without caring too much about index)
print(lst)                    # Prints the list

这也将打印99,因为它也试图找到128的其余部分,但这可能是一个有趣的挑战,如果你想学习d:

相关问题