2013-06-11 4 views
3

Я довольно смущен тем, как преобразовать эту программу в понимание списка. Какие-нибудь советы?конвертировать программу в список постижения

Вот оригинальный код, который я написал (также, я новичок в python, поэтому вы можете сказать мне, если это отстой, я не против). Код должен использовать встроенную функцию chr() для возврата строка, которая при печати, является ASCII-диаграмма, четыре записи в поперечнике. (только с использованием значений ASCII от 32 до 126 включительно)

def GiveAsciiChart5(): 
    count = 4 

    for value in range(32, 127): 
     count += 1 
     print " |ASCII Value|: ", "|",(value),"|", " |Character|: ", "|",chr(value),"|", 
     if count % 4 == 0: 
      print "\n", 

     #print " |ASCII Value|: ", "|",(value),"|", " |Character|: ", "|",chr(value),"|", 
def Main(): 
    GiveAsciiChart5() 

if __name__ == '__main__': 
    Main() 

Вот моя попытка сделать список понимание ... это, очевидно, не Работа. Я довольно смущен тем, где ввести переменную count? Я пытаюсь уменьшить его, используя списки и str.join().

def GiveAsciiChart6(): 
    count = 3 
    a = [ (i, chr(i)) for i in range(32,127)] 
    for count in a: 
     if count % 4 == 0: 
      print "\n" 
      print " |ASCII Value|: ", "|",(i),"|", " |Character|: ", "|",chr(i),"|", 



def Main(): 
    GiveAsciiChart6() 

if __name__ == '__main__': 
    Main() 

Я знаю, что есть способы, чтобы пойти и довольно ужасно в настоящее время. Я просто застрял и запутался в том, как отформатировать его таким образом ... любые советы приветствуются, не ожидая полных решений, поскольку я хотел бы узнать и понять, что происходит. Спасибо!

+0

вы могли бы быть более конкретным относительно того, что происходит не так во втором версия? – jaynp

+0

создайте функцию 'foo', так что' foo (i) 'возвращает нужную строку. Но помните, что такие команды, как 'print', не входят в понимание списка. понимание - это выражения *. а не программ. – Elazar

+0

@ user1850672 Вторая версия должна делать то же самое. Я просто пытаюсь привыкнуть к использованию списков, но у меня возникают проблемы с ними, когда они становятся более сложными, чем простые циклы через списки. – user2376566

ответ

0

Вот эквивалентное решение, используя список понимание и enumerate() встроенные функции:

def GiveAsciiChart5(): 
    vals = [(value, chr(value)) for value in range(32, 127)] 
    for i, (v, c) in enumerate(vals): 
     print " |ASCII Value|: ", "|", v, "|", " |Character|: ", "|", c, "|", 
     if not i % 4: 
      print "\n", 

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

+0

Мне нравится, как вы это сделали. Итак, «я» в основном действует как счет?Перечисление также довольно круто. Я слышал, это действительно упрощает вещи. – user2376566

+0

@ пользователь2376566 да, точно! enumerate присваивает счетчик каждому из значений. В сочетании с автоматической распаковкой значений мы имеем все переменные, которые нам нужны в декларации цикла! –

+0

Это действительно полезно! Большое спасибо за помощь. Я занимаюсь только python около 5 недель или около того, и я исхожу из языкового блока Google. Определенно кривая обучения ... но все это начинает иметь больше смысла. Еще раз спасибо! – user2376566

0

Чтобы не дать ответ полностью, я аннотировал код.

for count in a: #the type of count would be a tuple containing (i, chr(i)) 
    if count % 4 == 0: #so then what should this statement be? 
     print "\n" 
     print " |ASCII Value|: ", "|",(i),"|", " |Character|: ", "|",chr(i),"|", 
     #^remember, we are iterating through a list of tuples, the element 
     # our iteration is on is called count (what's 'i' doing here?) 
+0

Я вижу, что я сделал не так. Большое спасибо, я очень ценю это. – user2376566

0

При выполнении фрагмента кода ниже в терминале:

>>> count = 3 
>>> a = [ (i, chr(i)) for i in range(32,127)] 
>>> for count in a: 
...  print count 

Вы

(32, ' ') 
(33, '!') 
(34, '"') 
... 

Теперь, если вы попытаетесь строку (33, '!') % 4, вы получите TypeError: unsupported operand type(s) for %: 'tuple' and 'int'.

Как я вижу, ваше понимание списка, похоже, в порядке. У вас проблемы, потому что вы пытаетесь найти модуль кортежа.

+0

Это определенно имеет смысл. Благодаря! – user2376566

0
a = [(i, chr(i)) for i in range(32, 127)] 

for v, c in a: 
    print ' |ASCII Value|: | {v} | |Character|: | {c} |'.format(v=str(v).rjust(3), c=c), 
    if v % 4 == 0: 
     print 

Выход с использованием if v % 4 == 3:

|ASCII Value|: | 32 | |Character|: | | |ASCII Value|: | 33 | |Character|: | ! | |ASCII Value|: | 34 | |Character|: | " | |ASCII Value|: | 35 | |Character|: | # | 
|ASCII Value|: | 36 | |Character|: | $ | |ASCII Value|: | 37 | |Character|: | % | |ASCII Value|: | 38 | |Character|: | & | |ASCII Value|: | 39 | |Character|: | ' | 
|ASCII Value|: | 40 | |Character|: | (| |ASCII Value|: | 41 | |Character|: |) | |ASCII Value|: | 42 | |Character|: | * | |ASCII Value|: | 43 | |Character|: | + | 
|ASCII Value|: | 44 | |Character|: | , | |ASCII Value|: | 45 | |Character|: | - | |ASCII Value|: | 46 | |Character|: | . | |ASCII Value|: | 47 | |Character|: |/| 
|ASCII Value|: | 48 | |Character|: | 0 | |ASCII Value|: | 49 | |Character|: | 1 | |ASCII Value|: | 50 | |Character|: | 2 | |ASCII Value|: | 51 | |Character|: | 3 | 
|ASCII Value|: | 52 | |Character|: | 4 | |ASCII Value|: | 53 | |Character|: | 5 | |ASCII Value|: | 54 | |Character|: | 6 | |ASCII Value|: | 55 | |Character|: | 7 | 
|ASCII Value|: | 56 | |Character|: | 8 | |ASCII Value|: | 57 | |Character|: | 9 | |ASCII Value|: | 58 | |Character|: | : | |ASCII Value|: | 59 | |Character|: | ; | 
|ASCII Value|: | 60 | |Character|: | < | |ASCII Value|: | 61 | |Character|: | = | |ASCII Value|: | 62 | |Character|: | > | |ASCII Value|: | 63 | |Character|: | ? | 
|ASCII Value|: | 64 | |Character|: | @ | |ASCII Value|: | 65 | |Character|: | A | |ASCII Value|: | 66 | |Character|: | B | |ASCII Value|: | 67 | |Character|: | C | 
|ASCII Value|: | 68 | |Character|: | D | |ASCII Value|: | 69 | |Character|: | E | |ASCII Value|: | 70 | |Character|: | F | |ASCII Value|: | 71 | |Character|: | G | 
|ASCII Value|: | 72 | |Character|: | H | |ASCII Value|: | 73 | |Character|: | I | |ASCII Value|: | 74 | |Character|: | J | |ASCII Value|: | 75 | |Character|: | K | 
|ASCII Value|: | 76 | |Character|: | L | |ASCII Value|: | 77 | |Character|: | M | |ASCII Value|: | 78 | |Character|: | N | |ASCII Value|: | 79 | |Character|: | O | 
|ASCII Value|: | 80 | |Character|: | P | |ASCII Value|: | 81 | |Character|: | Q | |ASCII Value|: | 82 | |Character|: | R | |ASCII Value|: | 83 | |Character|: | S | 
|ASCII Value|: | 84 | |Character|: | T | |ASCII Value|: | 85 | |Character|: | U | |ASCII Value|: | 86 | |Character|: | V | |ASCII Value|: | 87 | |Character|: | W | 
|ASCII Value|: | 88 | |Character|: | X | |ASCII Value|: | 89 | |Character|: | Y | |ASCII Value|: | 90 | |Character|: | Z | |ASCII Value|: | 91 | |Character|: | [ | 
|ASCII Value|: | 92 | |Character|: | \ | |ASCII Value|: | 93 | |Character|: | ] | |ASCII Value|: | 94 | |Character|: |^| |ASCII Value|: | 95 | |Character|: | _ | 
|ASCII Value|: | 96 | |Character|: | ` | |ASCII Value|: | 97 | |Character|: | a | |ASCII Value|: | 98 | |Character|: | b | |ASCII Value|: | 99 | |Character|: | c | 
|ASCII Value|: | 100 | |Character|: | d | |ASCII Value|: | 101 | |Character|: | e | |ASCII Value|: | 102 | |Character|: | f | |ASCII Value|: | 103 | |Character|: | g | 
|ASCII Value|: | 104 | |Character|: | h | |ASCII Value|: | 105 | |Character|: | i | |ASCII Value|: | 106 | |Character|: | j | |ASCII Value|: | 107 | |Character|: | k | 
|ASCII Value|: | 108 | |Character|: | l | |ASCII Value|: | 109 | |Character|: | m | |ASCII Value|: | 110 | |Character|: | n | |ASCII Value|: | 111 | |Character|: | o | 
|ASCII Value|: | 112 | |Character|: | p | |ASCII Value|: | 113 | |Character|: | q | |ASCII Value|: | 114 | |Character|: | r | |ASCII Value|: | 115 | |Character|: | s | 
|ASCII Value|: | 116 | |Character|: | t | |ASCII Value|: | 117 | |Character|: | u | |ASCII Value|: | 118 | |Character|: | v | |ASCII Value|: | 119 | |Character|: | w | 
|ASCII Value|: | 120 | |Character|: | x | |ASCII Value|: | 121 | |Character|: | y | |ASCII Value|: | 122 | |Character|: | z | |ASCII Value|: | 123 | |Character|: | { | 
|ASCII Value|: | 124 | |Character|: | | | |ASCII Value|: | 125 | |Character|: | } | |ASCII Value|: | 126 | |Character|: | ~ | 

Если вы не хотите |ASCII Value|: | 32 | |Character|: | | на своей собственной линии, изменить if v % 4 == 0: к if v % 4 == 3:

+0

Я искал материал строкового формата. Я думаю, это довольно круто. Не могли бы вы объяснить мне, почему изменение v по модулю 4 == 0 на == до '3' ставит первый элемент обратно другим? Сначала меня смутило, почему это было отдельно. – user2376566

Смежные вопросы