Форум сайта python.su
0
Доброго времени суток!
помогите пожалуйста, в чем ошибка в коде?
Необходимо вывести числа из указанного диапазона в двумерный массив, так чтобы все простые числа шли в первом столбце по возрастанию вниз, остальные(составные числа) по возрастанию в строку до следующего простого числа(если находится простое то перевод строки и по новой), т.е. например
2
3, 4
5, 6
7, 8, 9, 10
11, 12
13, 14, 15, 16
17
и т.д….
# -*- coding: cp1251 -*- lst=[] i=0 j=1 print 2 k=0 lst.append([]) for n in range(3, 100): lst[i].append([]) for x in range(2, n/2+1): if n % x == 0: k=1 break#Выход из цикла по x, следующее n if k==0: lst[i][0]=n if k==1: lst[i][j]=n i+=1 j+=1 lst.append([]) k=0 print lst
Офлайн
35
как-то так… но можно и лучше.
def is_prime(n): if n % 2 == 0 and n > 2: return False return all(n % i for i in range(3, int(n**0.5) + 1, 2)) END_NUM = 100 first_prime = True index = 0 lst = [[] for x in range(2, END_NUM) if is_prime(x)] for num in range(2, END_NUM): if is_prime(num): if not first_prime: index += 1 else: first_prime = False lst[index].append(num)
>>> lst
[[2], [3, 4], [5, 6], [7, 8, 9, 10], [11, 12], [13, 14, 15, 16], [17, 18], [19,
20, 21, 22], [23, 24, 25, 26, 27, 28], [29, 30], [31, 32, 33, 34, 35, 36], [37,
38, 39, 40], [41, 42], [43, 44, 45, 46], [47, 48, 49, 50, 51, 52], [53, 54, 55,
56, 57, 58], [59, 60], [61, 62, 63, 64, 65, 66], [67, 68, 69, 70], [71, 72], [73
, 74, 75, 76, 77, 78], [79, 80, 81, 82], [83, 84, 85, 86, 87, 88], [89, 90, 91,
92, 93, 94, 95, 96], [97, 98, 99]]
Офлайн
857
>>> def isprime(n): ... if n < 2 or (n > 2 and n % 2 == 0): ... return False ... for i in range(3, int(n ** 0.5 + 1), 2): ... if n % i == 0: ... return False ... return True ... >>> def f(start, end): ... out = [] ... while start <= end: ... if isprime(start): ... out.append([start]) ... elif out: ... out[-1].append(start) ... start += 1 ... return out ... >>> f(2, 17) [[2], [3, 4], [5, 6], [7, 8, 9, 10], [11, 12], [13, 14, 15, 16], [17]] >>>
Офлайн
103
n = 100 lst = [] [((lst.append([x])) if not len([x for j in range(2, x) if not x % j]) else lst[-1].append(x)) for x in range(2, n+1)] print(lst)
map(lambda x: lst[-1].append(x) if [x for j in range(2, x) if not x % j] else lst.append([x]), range(2, n+1))
Отредактировано terabayt (Дек. 19, 2014 17:12:27)
Офлайн
857
EvgenKlimТо есть диапазон может быть задан как 2, 17 или 100, 500.
Необходимо вывести числа из указанного диапазона
terabaytПервая ещё выдаёт, а вторая - нет.
во, так лучше:
Офлайн
103
py.user.nextспасибо, не заметил.
То есть диапазон может быть задан как 2, 17 или 100, 500.
py.user.nextэт нужно было заменить на
Первая ещё выдаёт, а вторая - нет.
[((lst.append([x])) if not len([x for j in range(2, x) if not x % j]) else lst[-1].append(x)) for x in range(2, n+1)]
n, lst = (2, 100), [] map(lambda x: lst[-1].append(x) if [x for j in range(2, x) if not x % j] and lst else lst.append([x]), range(n[0], n[1]+1)) print(lst)
Офлайн
857
terabaytПервый столбец состоит из простых чисел.
вот так будет:
>>> n, lst = (4, 10), [] >>> map(lambda x: lst[-1].append(x) if [x for j in range(2, x) if not x % j] and lst else lst.append([x]), range(n[0], n[1]+1)) [None, None, None, None, None, None, None] >>> print(lst) [[4], [5, 6], [7, 8, 9, 10]] >>>
Офлайн
0
Большое всем спасибо за помощь!!!
Офлайн