¿Cómo buscar una cuadrícula de lista anidada y dar coordenadas con letras en Python?

Soy nuevo en Python y estoy luchando bastante para que esto funcione. Esta es mi tarea:

El cifrado de seis letras es un método para codificar un mensaje secreto que involucra tanto la sustitución como la transposición. El cifrado comienza al rellenar aleatoriamente una cuadrícula de 6  6 con las letras del alfabeto de la A a la Z y los dígitos del 0 al 9 (36 símbolos en total). Esta cuadrícula debe ser conocida tanto por el remitente como por el destinatario del mensaje. Las filas y columnas de la cuadrícula están etiquetadas con las letras A, B, C, D, E, F.

Escriba un progtwig Python que implemente el método de cifrado de seis letras. Su progtwig debe: 1. Crear una cuadrícula de 6×6 y rellenarla aleatoriamente con letras y números como se describe en el primer párrafo, luego pedirle al usuario que ingrese un mensaje secreto. 2. Muestre la cuadrícula 6×6 y el texto cifrado generado, después de que el usuario ingrese el mensaje secreto. 3. Indique al usuario que ingrese el texto cifrado para mostrar el mensaje original. Está bien pedirle al usuario que separe cada dos letras del texto cifrado con un espacio o una coma.

El problema con el que estoy luchando es cómo busco en las listas anidadas la letra colocada al azar que se ingresó y doy las coordenadas. Además, las coordenadas no se darán en números, es decir, 0,1, en lugar de letras, es decir, A, B Creo que podría administrar la encoding y la deencoding una vez que tenga la idea de cómo usar esta lista anidada.

Aquí está mi código hasta ahora:

grid = [["Z","9","G","Q","T","3"], ["Y","8","F","P","S","2"], ["X","7","E","O","R","1"], ["W","6","D","N","M","0"], ["V","5","C","L","K","U"], ["J","4","B","I","H","A"]] def main(): print("Welcome to the sixth cipher") print("Would you like to (E)Encode or (D)Decode a message?") operation = input() if(operation == "E"): encodecipher() elif(operation == "D"): decodecipher() else: print("Sorry, input not recognised") def encodecipher(): print("Please enter a message to encode:") messagetoencode = input() def decodecipher(): print("Decode Test") rowcolumn() def rowcolumn(): pass main() 

Puede usar la enumeración de Python para iterar sobre los valores y proporcionar una posición de índice de cada valor a medida que avanza:

 grid = [["Z","9","G","Q","T","3"], ["Y","8","F","P","S","2"], ["X","7","E","O","R","1"], ["W","6","D","N","M","0"], ["V","5","C","L","K","U"], ["J","4","B","I","H","A"]] search = 'D' for rownum, row in enumerate(grid): for colnum, value in enumerate(row): if value == search: print "Found value at (%d,%d)" % (rownum, colnum) 

Puede adaptar esto a su estructura de función elegida, como la siguiente (si los valores en su cuadrícula son únicos):

 def findvalue(grid, value): for rownum, row in enumerate(grid): for colnum, itemvalue in enumerate(row): if itemvalue == value: return (rownum, colnum) raise ValueError("Value not found in grid") 

Como esto generará un ValueError si no se encuentra el valor, tendrá que manejar esto en su código de llamada.

Si luego necesita asignar entre los números de fila y columna indexados en 0 a las letras A … F, puede hacer algo como:

 def numbertoletter(number): if number >= 0 and number <= 26: return chr(65 + number) else: raise ValueError('Number out of range') 

Lo que te dará lo siguiente:

 >>> numbertoletter(0) 'A' >>> numbertoletter(1) 'B' 

Ponerlo todo junto te da:

 value = 'B' row, col = map(numbertoletter, findvalue(grid, value)) print "Value '%s' found at location (%s, %s)" % (value, row, col) 

Me doy cuenta de que estás haciendo esto con fines de aprendizaje / tarea, pero te lo señalaré para que lo tengas en cuenta más adelante. Es más fácil pensar en lo que tienes como algo de 36 elementos (que resulta que se puede representar como un 6×6), o más explícitamente, tienes un carácter -> coord, y un dict es muy útil para hacer esto, y revertir eso…

 from string import ascii_uppercase, digits from random import shuffle from itertools import product # build 36 items list and randomise it chars = list(ascii_uppercase + digits) shuffle(chars) # alternatively, use your existing grid: from itertools import chain chars = list(chain.from_iterable(grid)) # ... # Create char -> (coords) lookup = dict(zip(chars, product('ABCDEF', repeat=2))) # Swap over so (coords) -> char rev_lookup = {v: k for k,v in lookup.iteritems()} 

Esta es una forma sencilla de obtener las coordenadas de un personaje en la cuadrícula:

 def find_pos(s): for i, j in enumerate(grid): try: return i, j.index(s) except ValueError: continue raise ValueError("The value {0!r} was not found.".format(s)) >>> find_pos("O") (2, 3)