Python:每日一题 139
本帖最后由 冬雪雪冬 于 2018-1-15 18:05 编辑我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。
题目:
已有一个由小到大数字组成列表,
list1 =
要求将数字是列表中其他数字倍数的剔除,如15, 24是3的倍数,就将15,24去除,14,21是7的倍数,就将14,21去除。注意数字仅是其本身的1倍,如3是3的1倍,是不需要去除的,否则最后的列表就成空的了。
要求给出最后剩余的列表。 本帖最后由 shigure_takimi 于 2018-1-12 16:39 编辑
list1 =
# 方法1:
length = len(list1)
result = ]
for index in range(1, length):
for i in list1[:index]:
if list1 % i == 0:
break
else:
result.append(list1)
print(result)
# 方法2:
for i in list1:
for j in list1[:list1.index(i)]:
if i % j == 0:
list1.remove(i)
break
print(list1)
#
#list1 = list(range(3,10000))时,方法1耗时2.84秒,方法2耗时0.98秒。
#list1 = list(range(3,50000))时,方法1耗时59.98秒,方法2耗时17.06秒。
#list1 = list(range(3,100000))时,方法1耗时272.97秒,方法2耗时70.5 秒。
#我好有耐心呀。 list1 =
number = len(list1)
answer = []
def prime(a):
for i in range(2,a):
if a % i == 0:
return False
return True
for i in range(0,number-1):
b = prime(list1)
if b :
answer.append(list1)
list1 = answer
print(list1)
本帖最后由 jerryxjr1220 于 2018-1-12 17:23 编辑
list1 =
from functools import reduce
print(sorted(list(reduce((lambda a,b:a&b), (set(list1)-set(range(e*2,495,e)) for e in list1)))))
再写个标记法:效率第一
def func(lst):
import numpy as np
num = np.zeros(max(lst)+1,dtype='int8')
for i in reversed(lst):
num = 1
num = 0
return np.nonzero(num).tolist()
这个方法用来筛选质数,效率也是非常高的。
list1 = list(range(2,100000))
print(func(list1))
10万以下的质数,0.3秒 list1 =
for i in list1:
for m in list1:
if i != m:
if m%i == 0:
list1.remove(m)
print(list1)
初学者用笨方法,也算是一种学习。{:10_250:}
l1=[……] # l1赋值这里省略了……
l2=l1[:]
l2.reverse()
l3=[]
for i in l2:
for j in l1:
if i != j and i%j==0:
l3.append(i)
break
for i in l3:
l2.remove(i)
l2.reverse()
print(l2)
结果:
OldList=
NewList=
for i in range(len(OldList)):
print('列表长度:',len(OldList))
print('i的值:',i)
for j in range(i+1,len(OldList)):
print('j的值:',j)
if(OldList%OldList==0):
print('被除数:',OldList)
print('除数:',OldList)
NewList.remove(OldList)
print('删除后的数组:',NewList)
OldList = NewList
print('列表的长度:',len(OldList))
print('j+1',j+1)
if(j+1 >=len(OldList)):
break
if(j+1 >=len(OldList)):
break
print('-------------------------------------') 本帖最后由 shigure_takimi 于 2018-1-12 18:36 编辑
shigure_takimi 发表于 2018-1-12 15:34
感谢 jerryxjr1220的点评。因为是自学,以前也没学过编程,不知道标记法。我去查一查。 list1 =
list2 = []
for i in list1:
n=0
for j in range(3,500):
if (i % j) == 0:
n+=1
if n==1:
list2.append(i)
print(list2) def delete_element(old_list):
new_list = old_list[:]
for i in new_list:
for j in new_list:
if (i%j == 0) and (i!=j):
old_list.remove(i)
break ####
return old_list
list1 =
out = delete_element(list1)
print(out) '''一个2重循环'''
list1 =
list2 = []
while list1:
'''弹出第一个数字进入list2'''
num = list1.pop(0)
list2.append(num)
'''在list1中消去该数字的倍数'''
for i in range(num*2,495,num):
if i in list1:
list1.remove(i)
print(list2)
直接算出所有倍数,然后用差集处理
def fun(lst):
result = set(lst)
for num in lst:
multiple = {num * i for i in range(2, lst[-1]//num + 1)}
result -= multiple
return sorted(result)
求余处理
def fun2(lst):
result = lst[:]
for i in lst:
for j in lst:
if not j%i and j in result:
result.remove(j)
return result def remove_multiple(ls):
max_multiple = max(ls) // min(ls)
i = 0
while True:
num = ls
for j in range(2, max_multiple):
num_multiple = num * j
if num_multiple in ls:
ls.remove(num_multiple)
elif num_multiple > max(ls):
break
i += 1
if i == len(ls) - 1:
return ls
if __name__ == '__main__':
ls = [
3, 7, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 32, 34, 35, 36, 39, 41, 42, 43,
45, 48, 49, 53, 64, 74, 78, 80, 88, 90, 91, 95, 96, 103, 107, 116, 142, 148, 152, 153, 158, 163, 171,
173, 174, 175, 176, 179, 181, 188, 190, 201, 204, 207, 216, 218, 222, 231, 235, 239, 248, 250, 251, 253,
258, 262, 265, 278, 292, 295, 296, 301, 305, 313, 317, 320, 326, 332, 334, 347, 355, 357, 358, 363, 365,
366, 368, 375, 377, 381, 391, 414, 417, 426, 428, 437, 438, 445, 453, 459, 466, 474, 476, 477, 489, 494
]
print(remove_multiple(ls))
结果: def fun(mlist):
t = []
for x in mlist:
f = True
for y in t:
if x % y == 0:
f = False
break
if f:
t.append(x)
return t
def main():
mlist = [3, 7, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 32, 34, 35, 36, 39,
41, 42, 43, 45, 48, 49, 53, 64, 74, 78, 80, 88, 90, 91, 95, 96, 103, 107, 116, 142, 148, 152, 153,
158, 163, 171, 173, 174, 175, 176, 179, 181, 188, 190, 201, 204, 207, 216, 218, 222, 231, 235, 239,
248, 250, 251, 253, 258, 262, 265, 278, 292, 295, 296, 301, 305, 313, 317, 320, 326, 332, 334, 347,
355, 357, 358, 363, 365, 366, 368, 375, 377, 381, 391, 414, 417, 426, 428, 437, 438, 445, 453, 459,
466, 474, 476, 477, 489, 494]
t = fun(mlist)
print(t)
if __name__ == "__main__":
main()
结果:
想了好久,实在想不出来{:10_269:}
RE: Python:每日一题 139
list1 = [3, 7, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 24, 26, 27,28, 30, 32, 34, 35, 36, 39, 41, 42, 43, 45, 48, 49, 53, 64, 74,
78, 80, 88, 90, 91, 95, 96, 103, 107, 116, 142, 148, 152, 153,
158, 163, 171, 173, 174, 175, 176, 179, 181, 188, 190, 201, 204,
207, 216, 218, 222, 231, 235, 239, 248, 250, 251, 253, 258, 262,
265, 278, 292, 295, 296, 301, 305, 313, 317, 320, 326, 332, 334,
347, 355, 357, 358, 363, 365, 366, 368, 375, 377, 381, 391, 414,
417, 426,428, 437, 438, 445, 453, 459, 466, 474, 476, 477, 489, 494]
list2 = list1 [:]
def sceen ():
for x in list1 :
for y in list1 :
if x%y == 0 :
list2.remove(x)
break
print (list2)#最终结果
sceen() 本帖最后由 8306最硬 于 2018-1-13 14:00 编辑
def del_multiple(lst):
for i in lst:
for j in lst:
if j % i == 0 and i is not j:
lst.remove(j)
return lst
lst =
list1 = [3, 7, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 32, 34, 35, 36, 39, 41, 42, 43, 45,
48, 49, 53, 64, 74, 78, 80, 88, 90, 91, 95, 96, 103, 107, 116, 142, 148, 152, 153, 158, 163, 171, 173, 174,
175, 176, 179, 181, 188, 190, 201, 204, 207, 216, 218, 222, 231, 235, 239, 248, 250, 251, 253, 258, 262,
265, 278, 292, 295, 296, 301,305, 313, 317, 320, 326, 332, 334, 347, 355, 357, 358, 363, 365, 366, 368, 375,
377, 381, 391, 414, 417, 426, 428, 437, 438, 445, 453, 459, 466, 474, 476, 477, 489, 494]
remove1=[]
for i in list1:
for j in list1:
if i!=j and i%j==0:
remove1.append(i)
remove1=list(set(remove1))
for i in remove1:
list1.remove(i)
print(list1) list =
for i in list:
for j in list:
if j == i:
continue
if j%i==0:
list.remove(j)
for i in list:
print(i,end=' ')
时间复杂度O(n2)
结果如有不对 恳请指正 list1 =
def generator():
global list1
while list1:
temp = list1.pop(0)
yield temp
list1 =
g = generator()
print()