冬雪雪冬 发表于 2018-1-12 14:00:00

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 15:34:51

本帖最后由 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 秒。
#我好有耐心呀。

空巷无人故人叹 发表于 2018-1-12 15:38:00

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 15:52:14

本帖最后由 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秒

小黑大人 发表于 2018-1-12 15:58:29

list1 =
for i in list1:
    for m in list1:
      if i != m:
            if m%i == 0:
                list1.remove(m)

print(list1)

graceasyi 发表于 2018-1-12 17:09:05

初学者用笨方法,也算是一种学习。{: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)

结果:

nononoyes 发表于 2018-1-12 18:26:23



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:35:10

本帖最后由 shigure_takimi 于 2018-1-12 18:36 编辑

shigure_takimi 发表于 2018-1-12 15:34


感谢 jerryxjr1220的点评。因为是自学,以前也没学过编程,不知道标记法。我去查一查。

大头目 发表于 2018-1-12 19:33:38

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)

haixiaotian 发表于 2018-1-12 20:03:54

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)

编程新血 发表于 2018-1-12 20:19:29

'''一个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)

solomonxian 发表于 2018-1-12 21:11:46

直接算出所有倍数,然后用差集处理
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

wyp02033 发表于 2018-1-12 22:54:55

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))
   
结果:

久疤K 发表于 2018-1-12 23:29:54

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()


结果:

小菜饼 发表于 2018-1-12 23:48:01

想了好久,实在想不出来{:10_269:}

vite 发表于 2018-1-13 10:57:02

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 13:54:55

本帖最后由 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 =

aegis1417 发表于 2018-1-13 18:15:54

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)

cnkizy 发表于 2018-1-13 22:17:00

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)
结果如有不对 恳请指正

yjsx86 发表于 2018-1-13 23:33:46

list1 =

def generator():
    global list1
    while list1:
      temp = list1.pop(0)
      yield temp
      list1 =

g = generator()
print()
页: [1] 2 3
查看完整版本: Python:每日一题 139