2015-01-15 2 views
-2

Я просто пытаюсь выполнить некоторые функции циклирования в Python, однако я довольно сильно застрял здесь.Диапазон номеров печати Python на нескольких строках

Я не знаю, должен ли он быть вложенным или одновременным циклом, и если да, то как его использовать.

Python говорит мне (ValueError: слишком много значений для распаковки)

Вот мой код:

rows = 16 

for i in range(rows): 

    for a,b,c,d,e,f,g,h,j in range(1, 17), range(18, 34), range(35, 40), range(41, 57), range(58, 74), range(75, 91), range(92, 108), range(109, 125), range(126, 127): 
     print '{0:4d} {1:4d} {2:4d} {3:4d} {4:4d} {5:4d} {6:4d} {7:4d}'.format(a, b, c, d, e, f, g, h, j) 

Я поясню хочу, чтобы приложение, чтобы распечатать диапазон чисел от 1 до 128 в эта схема более 16 строк с номерами происходит горизонтальная:

1 2 3 4 5 6 7 8 
    9 10 11 12 13 14 15 16 
122 122 122 122 122 122 122 122 
123 123 123 123 123 123 123 123 
124 124 124 124 124 124 124 124 
125 125 125 125 125 125 125 125 
126 126 126 126 126 126 126 126 
127 127 127 127 127 127 127 127 
128 128 128 128 128 128 128 128 
128 128 128 128 128 128 128 128 
124 124 124 124 124 124 124 124 
125 125 125 125 125 125 125 125 
126 126 126 126 126 126 126 126 
127 127 127 127 127 127 127 127 
128 128 128 128 128 128 128 128 
128 128 128 128 128 128 128 128 
+0

Вы хотите, чтобы цифры двигались вертикально? Это выглядит из кода, как будто вы пытаетесь увеличить число в каждом столбце, но ваш желаемый результат выглядит не так. –

+0

Я правильно читаю ваш выход?Начните с 121, перейдите к 128 и удвоьте его, вернитесь к 124, перейдите к 128 и удвойте его? – JonB

+0

JonB, это был просто быстро сгенерированный пример :) Я хочу, чтобы он продолжал расти, поэтому он начинается с 1 и заканчивается на 128, например: Первая строка: 1 2 3 4 5 6 7 8 Вторая строка: 9 10 11 12 13 14 15 16 –

ответ

1

Несколько вопросов в вашем коде. Главным образом:

  1. Если вам просто нужно распаковать значения, вам не нужно цикл:

    просто a , b = range(0,100), range(101,200) работает

  2. print '{0:4d}'.format(a) не ожидает a быть список.

Для меня ниже код работает:

rows = 16 

for i in range(rows): 
    a,b,c,d,e,f,g,h,j = range(1, 17), range(18, 34), range(35, 40), range(41, 57), range(58, 74), range(75, 91), range(92, 108), range(109, 125), range(126, 127) 
    print '{0:4d} {1:4d}'.format(10,100) 

Я понимаю, что это не выход, что вы хотите, но это, безусловно, должны помочь.

Update:

rows = 16 
for i in range(rows): 
    k = i*8+1 
    for j in range(k,k+8): 
     print '{0:4d}'.format(j), 
    print " " 
+0

Привет, спасибо за ваш ответ. Я в основном хочу, чтобы он подсчитывал вверх, вот почему я добавил диапазоны. Как в формате, который я показал, он должен рассчитывать от 1 до 128, а затем печатать его в этом формате, где первая строка будет «1 2 3 4 5 6 7 8 », а вторая строка будет« 9 10 11 12 13 14 15 16 », и так будет продолжаться до тех пор, пока не будет достигнуто 128 –

+0

@ EmilElkjærNielsen Я обновил ответ, чтобы получить желаемый результат в простейшей форме (хотя код, безусловно, может быть улучшен). –

+0

Работал безупречно! Большое спасибо –

-1

В ваших print statement у вас есть 8 {} и 9 значений

+0

Не имеет значения –

+0

Не имеет значения. Отредактировано и проверено код –

0

Это недействительно:

for i , b in range(0,10) , range(10,20): 

Вы не можете распаковать 2 петли в одном for заявления.

2

Это было бы гораздо менее запутанным способом:

def printRows(startNum, endNum, numCols=8): 
    for n in xrange(startNum, endNum, numCols): 
     for c in xrange(numCols): 
      curNum = n + c 
      if curNum > endNum: break 
      print '{0: >4}'.format(str(curNum)), 
     print 

In [57]: printRows(1,128) 

    1 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 100 101 102 103 104 
105 106 107 108 109 110 111 112 
113 114 115 116 117 118 119 120 
121 122 123 124 125 126 127 128 

Этот метод также позволяет более обобщенный подход, который можно использовать для печати только о любой таблицы данные startNum, endNum, и numCols. Например,

In [97]: printRows(37,129,10) 
    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 100 101 102 103 104 105 106 
107 108 109 110 111 112 113 114 115 116 
117 118 119 120 121 122 123 124 125 126 
127 128 129 

In [98]: printRows(1,15,3) 
    1 2 3 
    4 5 6 
    7 8 9 
    10 11 12 
    13 14 15 

In [99]: printRows(9,27,4) 
    9 10 11 12 
    13 14 15 16 
    17 18 19 20 
    21 22 23 24 
    25 26 27 
1

Вывод решения @ JonB. Он включает необязательный параметр функции для вычисления значения на основе текущего индекса n. Вы можете расширить этот пример, чтобы уравнение приняло начало, конец, num_column и словарь как дополнительные аргументы.

def x(n): 
    return n 

def print_rows(start, end, num_columns = 8, equation = x): 
    for n in xrange(start, end + 1): 
     print '{0: >4}'.format(str(equation(n))), 
     if (((n - (start - 1)) % num_columns) == 0 or n == end): 
      print 

# these return the same values as JonB's solution 
print_rows(1, 128) 
print_rows(37,129) 
print_rows(1,15,3) 

def multiply_by_three(n): 
    return n * 3 

print_rows(1,20,4,multiply_by_three) 
# returns 
    3 6 9 12 
    15 18 21 24 
    27 30 33 36 
    39 42 45 48 
    51 54 57 60 
Смежные вопросы