2011-09-12 2 views
-3

Possible en double:
Overriding the newline generation behaviour of Python's print statement
PPM image to ASCII art in Pythonliste python question

Ceci est mon code, j'ai l'impression des personnages, mais je dois qu'ils soient sur la même ligne et rupture au La fin de la ligne.

import sys 

def main(filename): 
    image = open(filename) 
    #reads through the first three lines 
    color = image.readline().splitlines() 
    size_width, size_height = image.readline().split() 
    max_color = image.readline().splitlines() 

    #reads the body of the file 
    pixels = image.read().split() 
    red = 0 
    green = 0 
    blue = 0 
    r_g_b_value = [] 
    #pulls out the values of each tuple and coverts it to its grayscale value 
    for i in pixels: 
     if i != "\n" or " ": 
     if len(i) == 3: 
      red = int(i[0]) * .3 
      green = int(i[1]) * .59 
      blue = int(i[2]) * .11 
     elif len(i) == 2: 
      red == int(i[0]) 
      green == int(i[1]) 
      blue == 0 
     elif len(i) == 1: 
      red == int(i[0]) 
      green == 0 
      blue == 0 

     r_g_b_value = [red + green + blue] 
     grayscale = [] 
     character = [] 

     for j in r_g_b_value: 
      if int(j) <= .2: 
       character = "M" 
      elif int(j) > .2 and int(j) <= .4: 
       character = "#" 
      elif int(j) > .4 and int(j) <= .6: 
       character = "A" 
      elif int(j) > .6 and int(j) <= .8: 
       character = "@" 
      elif int(j) > .8 and int(j) <= 1: 
       character = "$" 
      elif int(j) > 1 and int(j) <= 1.2: 
       character = "0" 
      elif int(j) > 1.2 and int(j) <= 1.4: 
       character = "e" 
      elif int(j) > 1.4 and int(j) <= 1.6: 
       character = "a" 
      elif int(j) > 1.8 and int(j) <= 2: 
       character = "o" 
      elif int(j) > 2 and int(j) <= 2.2: 
       character = "=" 
      elif int(j) > 2.25 and int(j) <= 2.5: 
       character = "+" 
      elif int(j) > 2.5 and int(j) <= 2.75: 
       character = ";" 
      elif int(j) > 2.75 and int(j) <= 3: 
       character = ":" 
      elif int(j) > 3 and int(j) <= 3.4: 
       character = "," 
      elif int(j) > 3.4 and int(j) <= 3.9: 
       character = "." 
      else: 
       character = " " 
      character += character 
      grayscale = [character] 
      print(grayscale) 

Toute aide serait appréciée.

+12

ce code me fait peur !! –

+0

Ne pensez pas que cette question précédente est en fait un bon doublon, phooji. – Amber

+0

@asmith: J'ai marqué votre question en tant que doublon d'une ancienne question de stackoverflow. En outre, vous posez beaucoup de questions qui sont très similaires dans la nature; ceci est déconseillé (http://blog.stackoverflow.com/2009/04/a-day-in-the-penalty-box/). – phooji

Répondre

3

Indiquez le end parameter for print() être une chaîne vide, et il ne sera pas automatiquement ajouter une nouvelle ligne:

>>> print('foo', end=''); print('bar'); print('baz') 
foobar 
baz 

La valeur par défaut pour end est '\n'; end est ajouté après la sortie de tous les arguments normaux passés à print(). Par exemple, print('foo', 'bar'); print('baz') produirait la même chose que ci-dessus.

Il existe également le paramètre sep qui est ajouté entre chacun des objets en cours d'impression, un join(). Cela ne vaut rien.


Par ailleurs, vous pouvez réécrire tout le bloc ci-dessous:

for j in r_g_b_value: 
     if int(j) <= .2: 
      character = "M" 
     elif int(j) > .2 and int(j) <= .4: 
      character = "#" 
     elif int(j) > .4 and int(j) <= .6: 
      character = "A" 
     elif int(j) > .6 and int(j) <= .8: 
      character = "@" 
     elif int(j) > .8 and int(j) <= 1: 
      character = "$" 
     elif int(j) > 1 and int(j) <= 1.2: 
      character = "0" 
     elif int(j) > 1.2 and int(j) <= 1.4: 
      character = "e" 
     elif int(j) > 1.4 and int(j) <= 1.6: 
      character = "a" 
     elif int(j) > 1.8 and int(j) <= 2: 
      character = "o" 
     elif int(j) > 2 and int(j) <= 2.2: 
      character = "=" 
     elif int(j) > 2.25 and int(j) <= 2.5: 
      character = "+" 
     elif int(j) > 2.5 and int(j) <= 2.75: 
      character = ";" 
     elif int(j) > 2.75 and int(j) <= 3: 
      character = ":" 
     elif int(j) > 3 and int(j) <= 3.4: 
      character = "," 
     elif int(j) > 3.4 and int(j) <= 3.9: 
      character = "." 
     else: 
      character = " " 

avec ce code beaucoup plus simple:

# Mapping of values to symbol tuples, ordered from least to greatest upper bound. 
# Format is (symbol, upperbound) - lower bounds are implied by 
# the previous symbol's upper bound, non-inclusive. 
symbol_set = [('M', 0.2), ('#', 0.4), ('A', 0.6), ('@', 0.8), ('$', 1.0), 
    ('0', 1.2), ('e', 1.4), ('a', 1.6), ('o', 2.0), ('=', 2.2), ('+', 2.5), 
    (';', 2.75), (':', 3.0), (',', 3.4), ('.', 3.9)] 

for j in r_g_b_value: 
    for symbol, cutoff in symbol_set: 
     if j <= cutoff: 
      character = symbol 
      break 
    else: 
     character = ' ' 

(La construction for: else: signifie simplement que «s'il y avait jamais break déclenché dans la boucle, faites ce qui est dans la section else:.Il gère votre cas 'else' de l'ancien code.)

Vous devriez toujours essayer de laisser l'ordinateur faire le travail pour vous - au lieu d'écrire 10-15 presque identiques clauses elif, utilisez un peu d'intelligence pour le faire fonctionner avec une boucle à la place.

+0

peut-être en utilisant 'bisect' (http://docs.python.org/library/bisect.html#other-examples) est une meilleure option ici –

+0

Oui,' bisect' serait une façon encore plus succincte d'écrire la boucle - L'inconvénient est qu'il nécessite un format différent pour le jeu de symboles (tableaux distincts de seuils et éléments auxquels les index doivent correspondre). Vous pouvez générer ces deux listes à partir du format de liste que j'ai utilisé ci-dessus ('symbols = [x [0] pour x dans symbol_set]', 'cutoffs = [x [1] pour x dans symbol_set]'), mais ce serait à peu près autant de travail de toute façon. Vraiment vient à la façon dont vous préférez spécifier vos données. – Amber

+0

'symboles, seuils = zip (* symbol_set)' –