Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 19, 2014 13:29:16

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

Доброго времени суток!

помогите пожалуйста, в чем ошибка в коде?

Необходимо вывести числа из указанного диапазона в двумерный массив, так чтобы все простые числа шли в первом столбце по возрастанию вниз, остальные(составные числа) по возрастанию в строку до следующего простого числа(если находится простое то перевод строки и по новой), т.е. например

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 

Офлайн

#2 Дек. 19, 2014 15:09:45

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

как-то так… но можно и лучше.

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]]

Офлайн

#3 Дек. 19, 2014 15:41:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

>>> 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]]
>>>



Офлайн

#4 Дек. 19, 2014 17:04:22

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

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



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Дек. 19, 2014 17:12:27)

Офлайн

#5 Дек. 20, 2014 02:26:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

EvgenKlim
Необходимо вывести числа из указанного диапазона
То есть диапазон может быть задан как 2, 17 или 100, 500.

terabayt
во, так лучше:
Первая ещё выдаёт, а вторая - нет.



Офлайн

#6 Дек. 20, 2014 02:44:20

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

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)



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Дек. 20, 2014 04:40:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

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]]
>>>



Офлайн

#8 Дек. 22, 2014 07:43:43

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

вывести числа из диапазона в двумерный массив

Большое всем спасибо за помощь!!!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version