英文:
looping element into a list
问题
以下是您提供的代码的翻译:
我正在尝试列出数字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)添加到列表中的问题可能是由于内部循环条件的限制。您可以尝试将内部循环的条件稍微修改,以确保它考虑到99 % 64的情况。以下是一个可能的修复:
num = 99
div = 2
lst = []
while div < num:
r = num % div
while r != 0 and r not in lst:
lst.append(r)
if div == 2: # 添加此条件以确保考虑到99 % 64的情况
lst.append(num % 64)
div = div * div
print(lst)
这应该产生您期望的输出:[1, 3, 35]。希望这可以帮助您解决问题。如果您有其他问题,请随时提问。
英文:
I am trying to make a list of the unique remainders for the number 99 divided by the powers of 2 (2,4,8,16,32,64) which are lower then that of 99.
here is the code:
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)`
The code I use doesn't append the remainder for the 99 % 64 in the list, which is 35.
program output:
[1,3]
intended output:
[1,3,35]
I am a complete beginner in programming, I would appreciate if you can help me find out the correct approach for the problem I have.
答案1
得分: 1
你的方法
添加一个变量来跟踪幂次,并在每次循环中递增它:
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 # 递增幂次变量
div = div ** up # 双星号表示幂运算
print(div)
print(lst)
另一种方法
你也可以以更具Python风格的方式完成它。
- 第一行返回一个列表,其中包含小于99的所有2的幂
- 第二行将每个元素映射到其余数,将其转换为数据类型set(以保留所有唯一元素),最后将其转换为列表。
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]))) # 不要这样做
英文:
Your way
Add a variable to keep track of the power and increment it in each loop:
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)
Another way
You can do it also in a more pythonic way.
- First line, returns a list with all powers of 2 lower than 99
- Second line, maps each element to its remainders, converts it to the datatype set (to keep all unique elements), and finally converts it to 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)
I would not suggest putting it all in one line like below because you lose readability.
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
答案2
得分: 1
Here is the translated code:
你的 `div` 在每一步中都在增加,如下所示:
```plaintext
0 -> 2
1 -> 4 # 2*2
2 -> 16 # 4*4
3 -> 256 # 16 * 16
在第3步/循环中,div
的值大于 num
,即 256 > 99,因此程序在 while
循环中结束,因此退出,你的输出变为 [1, 3]
。
要解决这个问题,你需要以2的倍数增加 div
的值。以下是代码示例:
>>> 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}
使用具有字典属性的集合推导式,因为在那里顺序是保留的:
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]) # 使用 list(result.keys()) 以获取列表输出
<details>
<summary>英文:</summary>
your `div` is incrementing in each step as
0 ->2
1 -> 4 # 22
2 -> 16 # 44
3 -> 256 # 16 * 16
here in step/loop 3, value of `div` is more than `num`, ie 256 > 99 , hence program end in `while` loop and thus
exit, and your output become `[1, 3]` only
to solve this, you need to increase value of `div` by multiple of 2. Below is code for you
>>> 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]
little better performance code here isd for you wutgh using 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]
>>>
using set comprehension
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}
using set comprehension using dict property as order is metained there
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
</details>
# 答案3
**得分**: 1
你应该在一个集合中构建你的唯一值集合,最后对集合进行排序以得到所需的输出。
```python
num = 99
unique = set()
div = 2
while div < num:
unique.add(num % div)
div *= 2
print(sorted(unique))
输出:
[1, 3, 35]
英文:
You should build your collection of unique values in a set. Finally sort the set to give the output as required
num = 99
unique = set()
div = 2
while div < num:
unique.add(num%div)
div *= 2
print(sorted(unique))
Output:
[1, 3, 35]
答案4
得分: 0
以下是您要的代码部分的中文翻译:
老实说,过于复杂化只会让你很快迷失方向。
num = 99
div = 2
power = 1
lst = []
while div < num: # 我们只关心小于 num 的 div 值
div = div**power # 这逐渐将 div 提升到指数幂
power += 1 # 这会在每次循环中将 power 增加 1,其他有用的迭代操作符有 [-=,*=]
lst.append(num % div) # '将' num/div 的余数添加到 lst 中(*将其添加到列表中,不太关心索引)
print(lst) # 打印列表
这也会打印出 99,因为它试图找到 128 的余数,但如果您想学习的话,这可能是一个有趣的挑战。
英文:
Honestly, overcomplicating it is the best way to get really lost really quickly.
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
This will also print 99 as it trys to find the remainder of 128 as well, but that might be a fun challenge for you to figure out if you're trying to learn d:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论