Imprimiendo un patrón a través del uso de un diccionario -- python campo con python-3.x campo con hash-map campo con ascii-art camp codereview Relacionados El problema

Printing a pattern through the use of a dictionary


1
vote

problema

Español

Tuvimos que pagar un programa C a Python. El código funciona, pero utiliza un diccionario para resolver el problema. Esto no se siente como el uso correcto de un diccionario. ¿Hay una mejor manera?

  #!/usr/bin/env python3  def main():     while True:         height = input("Height: ")         try:             height = int(height)             if height >= 0:                 break         except:             pass      mtn={}     space_mtn(height,mtn)     hashs_mtn(height,mtn)     print_mtn(height,mtn)  def space_mtn(height,mtn):      for i in range(height):         for j in range(2*height+2):             mtn[i,j]=" "     return   def hashs_mtn(height,mtn):      for i in range(height):         for  j in range(height-1,height-i-2,-1):             mtn[i,j] = '#'      for i in range(height):         for j in range(height+2,height+i+3):             mtn[i,j] = '#'     return  def print_mtn(height,mtn):      for i in range(height):         for j in range(height+3+i):             print("{}".format(mtn[i,j]),end="")         print("")     return   if __name__ == "__main__":     main()   
Original en ingles

We had to port a c program to python. The code works but uses a dictionary to solve the problem. This doesn't feel like the right use of a dictionary. Is there a better way?

#!/usr/bin/env python3  def main():     while True:         height = input("Height: ")         try:             height = int(height)             if height >= 0:                 break         except:             pass      mtn={}     space_mtn(height,mtn)     hashs_mtn(height,mtn)     print_mtn(height,mtn)  def space_mtn(height,mtn):      for i in range(height):         for j in range(2*height+2):             mtn[i,j]=" "     return   def hashs_mtn(height,mtn):      for i in range(height):         for  j in range(height-1,height-i-2,-1):             mtn[i,j] = '#'      for i in range(height):         for j in range(height+2,height+i+3):             mtn[i,j] = '#'     return  def print_mtn(height,mtn):      for i in range(height):         for j in range(height+3+i):             print("{}".format(mtn[i,j]),end="")         print("")     return   if __name__ == "__main__":     main() 
           

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

¿Por qué lo está utilizando, parece un list de list s tendría más sentido que un 9988776665544332 . Esto es algo así como una matriz de 2 dimensiones en c.

Su mtn La inicialización se convierte en:

  mtn = []   

Tendrá que hacer un poco más de trabajo en space_mtn para generar los sublistas:

  def space_mtn(height,mtn):     for i in range(height):         mtn.append([])             # Append an empty sublist at each level         for j in range(2*height+2):             mtn[-1].append(" ")    # Append a space to the end of the currently-last list     return   

Ahora en hash_mtn y print_mtn8 , simplemente cambie su mtn[i,j] llamadas a list0 .

Ahora, hay muchas maneras de hacer que este código sea menos similar a C y más "Pythonic". Tales discusiones son probablemente mejores para revisión del código . Solo diré que es posible (aunque no necesariamente "mejor") obtener una funcionalidad equivalente al reemplazar todo después de su entrada list1 bucle con una línea:

  list2  
 

For how you're using it, it seems like a list of lists would make more sense than a dict. This is somewhat like a 2-dimensional array in C.

Your mtn initialization becomes:

mtn = [] 

You'll need to do a little more work in space_mtn to generate the sublists:

def space_mtn(height,mtn):     for i in range(height):         mtn.append([])             # Append an empty sublist at each level         for j in range(2*height+2):             mtn[-1].append(" ")    # Append a space to the end of the currently-last list     return 

Now in hash_mtn and print_mtn, just change your mtn[i,j] calls to mtn[i][j].

Now, there are lots of ways to make this code less C-like and more "Pythonic". Such discussions are probably better for Code Review. I'll just say that it's possible (although not necessarily "best") to get equivalent functionality by replacing everything after your input while loop with one line:

print('\n'.join('{0:>{1}}  {0:{1}}'.format('#'*(i+1), height) for i in range(height))) 
 
 
     
     
-1
 
vote

Los diccionarios son geniales. Mientras no le importe un pedido específico (aunque hay formas de hacerlas ordenadas y creo que estarán en una próxima liberación de Python).

En su caso, tal vez el uso de zip podría ser útil .

 

Dictionaries are great. As long as you don't care about a specific order (though there are ways of making them ordered and I believe they will be in a upcoming release of python).

In your case maybe the use of zip could be useful.

 
 
 
 

Relacionados problema

6  Haciendo un patrón en forma de rectangular  ( Making a rectangular shaped pattern ) 
Me gustaría que alguien sugiera una mejor manera de crear este patrón en Java, que estoy seguro, es posible: package com.spakai.undoredo; public interface...

9  Python impar número diamante  ( Python odd number diamond ) 
Hice un programa de diamantes rápido que toma solo números impares mientras devuelve un error con números, o 0. El código se ve bastante feo para mí, especi...

5  La forma correcta de colgar un hombre: parte final  ( The right way to hang a man final part ) 
El problema: Haciendo un juego de Hangman simple. Esta es una continuación de la siguiente pregunta: la forma correcta de colgar un hombre . Allí acababa d...

7  Imprime un tablero de ajedrez  ( Print a chessboard ) 
Estoy trabajando a través de elocuente javascript y acaba de hacer los ejemplos en el Capítulo 2. Uno es crear Una cuadrícula de tablero de ajedrez de tamañ...

43  La forma correcta de colgar a un hombre  ( The right way to hang a man ) 
Problema: He visto algunas preguntas sobre Hangman. Por lo general, esto se hace de una manera muy hackeable, que generalmente no se puede generalizar más. ...

6  Imprimiendo una escalera de texto  ( Printing a staircase of text ) 
Básicamente, se le solicita a un usuario que ingrese una serie de escaleras y una escalera cuando se genera un tipo en él. Sé que esto es descuidado y mis nom...

6  Buscar número de más en una matriz 2D  ( Find number of plus in a 2d array ) 
Problema Chargrid El CharGrid La clase encapsula una matriz de 2-D con una pareja de operaciones. INT APULUS () Busque un patrón '+' en la cuadrícu...

8  Impresión de letras en orden como una pirámide  ( Printing letters in order like a pyramid ) 
Hay este HackerRank Pregunta , donde necesitamos un Rhombus de letras . En cuanto a mi opinión, se puede ver como un poco de fractal, o lógica similar. Bu...

12  Imprimir grandes números, o no grande pero grande  ( Printing large numbers or not large but large ) 
Acabo de empezar a aprender a Java hace aproximadamente un mes. Me pregunto, ¿qué hará un desarrollador experimentado de manera diferente en el código a conti...

1  Simulación de la placa de galton  ( Galton board simulation ) 
Este programa está escrito para Windows 7 en MINGW utilizando GCC. Estoy buscando recomendaciones para mejorar la portabilidad del programa. /* galtonboa...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos