python - 浏览列表,每当出现特定类别的数字时,创建其他类别的最新数字列表
问题描述
假设我有一个随机数列表
随机列表 = [9, 8, 18, 1, 17, 3, 13, 4, 13, 1, 9, 10, 7, 13, 3, 9, 13, 10, 18, 10, 19, 3, 14, 14 , 19, 4, 20, 17, 8, 17, 3, 12, 8, 12, 1, 2, 15, 13, 2, 8, 18, 10, 14, 11, 17, 11, 2, 7, 4 , 7, 5, 5, 18, 7, 11, 13, 20, 9, 2, 14, 19, 1, 16, 10, 16, 19, 13, 19, 11, 17, 8, 2, 10, 16 , 5, 14, 7, 11, 17, 9, 9, 6, 12, 6, 12, 4, 14, 10, 2, 6, 9, 1, 14, 4, 14, 13, 18, 13, 6 , 8]
数字分为三类: 可以被两个(2,4,6,8,10,12,14,16,18,20)素数整除的数字,除了两个(3,7,11,13,17,19) ) 休息 (1,5,9,15)
现在我想做的是以下内容:我将浏览列表,每当出现一些其余类别时,我想创建一个像这样 [%2, prime] 的列表,而元素是最近出现的元素名单。目标是拥有一个包含两个元素的列表。我希望它清楚我想要做什么。这是我的代码:
randomlist = [9, 8, 18, 1, 17, 3, 13, 4, 13, 1, 9, 10, 7, 13, 3, 9, 13, 10, 18, 10, 19, 3, 14, 14, 19, 4, 20, 17, 8, 17, 3, 12, 8, 12, 1, 2, 15, 13, 2, 8, 18, 10, 14, 11, 17, 11, 2, 7, 4, 7, 5, 5, 18, 7, 11, 13, 20, 9, 2, 14, 19, 1, 16, 10, 16, 19, 13, 19, 11, 17, 8, 2, 10, 16, 5, 14, 7, 11, 17, 9, 9, 6, 12, 6, 12, 4, 14, 10, 2, 6, 9, 1, 14, 4, 14, 13, 18, 13, 6, 8]
def check_prime(x):
for i in range(2, x):
if (x % i) == 0:
return False
else:
return True
def check_number(x):
if x%2 == 0:
return "zweier"
elif check_prime(x) == True:
return "prim"
else:
return "rest"
final_list = []
partial_list = [0,0]
for x in randomlist:
if check_number(x) =="zweier":
partial_list[0] = x
elif check_number(x) == "rest":
partial_list[1] = x
else:
final_list.append(partial_list)
for x in final_list:
print(x)
输出:
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
[8, 9]
让我非常困惑的是,如果我在创建 final_list 成员后立即打印它们,它会显示正确的解决方案:
randomlist = [9, 8, 18, 1, 17, 3, 13, 4, 13, 1, 9, 10, 7, 13, 3, 9, 13, 10, 18, 10, 19, 3, 14, 14, 19, 4, 20, 17, 8, 17, 3, 12, 8, 12, 1, 2, 15, 13, 2, 8, 18, 10, 14, 11, 17, 11, 2, 7, 4, 7, 5, 5, 18, 7, 11, 13, 20, 9, 2, 14, 19, 1, 16, 10, 16, 19, 13, 19, 11, 17, 8, 2, 10, 16, 5, 14, 7, 11, 17, 9, 9, 6, 12, 6, 12, 4, 14, 10, 2, 6, 9, 1, 14, 4, 14, 13, 18, 13, 6, 8]
def check_prime(x):
for i in range(2, x):
if (x % i) == 0:
return False
else:
return True
def check_number(x):
if x%2 == 0:
return "zweier"
elif check_prime(x) == True:
return "prim"
else:
return "rest"
final_list = []
partial_list = [0,0]
for x in randomlist:
if check_number(x) =="zweier":
partial_list[0] = x
elif check_number(x) == "rest":
partial_list[1] = x
else:
final_list.append(partial_list)
print(final_list[-1])
输出:
[18, 9]
[18, 9]
[18, 9]
[18, 9]
[4, 9]
[4, 9]
[10, 9]
[10, 9]
[10, 9]
[10, 9]
[10, 9]
[10, 9]
[14, 9]
[20, 9]
[8, 9]
[8, 9]
[12, 9]
[2, 15]
[14, 15]
[14, 15]
[14, 15]
[2, 15]
[4, 15]
[4, 15]
[4, 15]
[18, 15]
[18, 15]
[18, 15]
[14, 9]
[14, 9]
[16, 9]
[16, 9]
[16, 9]
[16, 9]
[16, 9]
[16, 9]
[14, 9]
[14, 9]
[14, 9]
[6, 9]
[14, 9]
[18, 9]
所以看起来基本的想法是可以的。我尝试了很多,但我无法找出我做错了什么。非常感谢您的帮助!
解决方案
这样做的原因是,当您遍历 randomlist 中的项目并将 partial_list 附加到 final_list 时,您附加的是对同一对象 (partial_list) 的引用,而不是包含的值。
如果将 append 语句更改为:
final_list.append(partial_list.copy())
每次都会附加一个 partial_list 的副本,您的代码最终将打印正确的结果。
因此,您的代码将是:
def check_prime(x):
for i in range(2, x):
if (x % i) == 0:
return False
else:
return True
def check_number(x):
if x%2 == 0:
return "zweier"
elif check_prime(x) == True:
return "prim"
else:
return "rest"
final_list = []
partial_list = [0,0]
for x in randomlist:
if check_number(x) =="zweier":
partial_list[0] = x
elif check_number(x) == "rest":
partial_list[1] = x
else:
final_list.append(partial_list.copy())
for x in final_list:
print(x)
推荐阅读
- javascript - React Bootstrap - 当值增加但重置为 0% 时如何为 ProgressBar 设置动画?
- android - 文本视图形状显示为椭圆形,即使形状是圆形
- database - 您如何处理现有系统中新数据的收集和存储?
- android - 是否有 API 可以访问移动设备上的位置历史记录?
- javascript - 如果通过循环动态创建html,如何将图像对象设置为图像src
- python - 高性能适用于熊猫分组
- c++ - “隐藏在外部范围中定义的同名实体”不成立
- elasticsearch - Elasticsearch:我可以安全地删除收缩索引吗?
- java - xpath如何选择所有匹配的元素
- excel - 使用 xlwings 打开工作簿