Categorías
Python

IDE Python y Editores de código (Guía)

 

Tabla de Contenidos

  • seleccione el derecho de las funciones integradas para la JobIterate Con enumerate () En lugar de gama () Use Listas por comprensión En lugar de mapa () y el filtro () Depurar con punto de interrupción () en lugar de impresión () Las cadenas de formato con F-StringsSort listas de números complejos con ordenados ()
  • Iterar con enumerate () en lugar de gama ()
  • Use Listas por comprensión En lugar de mapa () y el filtro ()
  • depuración con punto de interrupción () En lugar de impresión ()
  • Las cadenas de formato con F-cuerdas
  • listas Ordenar complejo con ordenados ()
  • apalancamiento Estructuras de datos Valores EffectivelyStore único con memoria SetsSave Con GeneratorsDefine valores por defecto en diccionarios con .get () y .setdefault () Valores
  • tienda únicos con conjuntos de
  • Almacenar memoria con los generadores
  • Definir valores predeterminados en los diccionarios Con .get () y .setdefault ()
  • tomar ventaja de Python estándar LibraryHandle Missing diccionario Claves Con collectio ns.defaultdict () Contar Hashable objetos con grupos de cuerda con una cuerda común collections.CounterAccess ConstantsGenerate permutaciones y combinaciones Con itertools
  • manija Missing Claves de diccionario Con collections.defaultdict ()
  • Count Hashable objetos con grupos de cuerda común collections.Counter
  • Acceso con constantes de cadena
  • generar permutaciones y combinaciones con itertools
  • Conclusión: Codificación Entrevista Superpoderes
  • Iterar con enumerate () En lugar de gama ()
  • Use Listas por comprensión En lugar de mapa () y filtro ()
  • depuración con punto de interrupción () en lugar de cuerdas (impresión)
  • formato con F-cuerdas
  • listas Ordenar complejo con valores ordenados ()
  • tienda únicos con conjuntos de
  • Almacenar memoria con los generadores
  • Definir valores predeterminados en los diccionarios Con .get () y .setdefault ()
  • manija Missing Diccionario Claves Con collections.defaultdict ()
  • Count Hashable objetos con collections.Counter
  • grupos de cuerda común de acceso Con constantes de cadena
  • generar permutaciones y combinaciones Con itertools

has llegado más allá de la llamada telefónica con el reclutador, y ahora es el momento de demostrar que sabe cómo resolver problemas con el código real. Si se trata de un ejercicio HackerRank, una asignación para llevar a casa, o una entrevista pizarra en el sitio, este es su momento para demostrar sus habilidades de entrevista de codificación.

Pero las entrevistas no son sólo acerca de la resolución de problemas: son también de demostrar que se puede escribir el código de producción limpia. Esto significa que usted tiene un profundo conocimiento de Python de funcionalidad integrada y bibliotecas. Esto muestra el conocimiento empresas que se pueden mover de forma rápida y no duplicará la funcionalidad que viene con el lenguaje simplemente porque no saben que existe.

En real del pitón , hemos puesto nuestras cabezas juntas y discutido qué herramientas siempre estamos impresionados de ver en las entrevistas de codificación. Este artículo le guiará a través de lo mejor de esa funcionalidad, comenzando con Python, entonces el apoyo nativo de Python para estructuras de datos, y, finalmente, de gran alcance (y, a menudo subestimado) de la biblioteca estándar de Python muebles empotrados.

En este artículo, usted aprenderá a:

  • Uso enumerate () para iterar sobre ambos índices y valores
  • depuración de código problemática con punto de interrupción ()
  • Formato cadenas eficazmente con F-strings
  • Ordenar listas con argumentos personalizados
  • Use generadores en lugar de las listas por comprensión a la memoria conserva
  • Definir valores por defecto cuando se esté buscando claves de diccionario
  • Contar objetos hashable con la clase collections.Counter
  • uso de la biblioteca estándar para obtener listas de permutaciones y combinaciones
  • Bono

gratuito: 5 pensamientos sobre Python Maestría, un curso gratuito para los desarrolladores de Python que muestra la hoja de ruta y la mentalidad que necesita para tomar sus habilidades de Python al siguiente nivel.

seleccione el derecho de las funciones integradas para el empleo

Python tiene una gran biblioteca estándar, pero sólo una pequeña biblioteca de funciones integradas, que siempre están disponibles y no tienen que ser importados. Merece la pena ir a través de cada uno, pero hasta que llegue la oportunidad de hacerlo, aquí están algunos incorporado en la comprensión de las funciones de la pena cómo utilizar, y en el caso de algunos de ellos, ¿qué alternativas para utilizar en su lugar.

Iterar Con enumerate () En lugar de gama ()

Este escenario podría llegar a más que cualquier otro en las entrevistas de codificación: usted tiene una lista de elementos, y que necesita para iterar sobre la lista con acceso tanto a los índices y la valores.

Hay una pregunta de la entrevista de codificación clásica llamado FizzBuzz que puede ser resuelto por iteración en ambos índices y valores. En FizzBuzz, se le da una lista de números enteros. Su tarea es hacer lo siguiente:

A menudo, los desarrolladores va a resolver este problema con la gama ():

>>> numbers = [45, 22, 14, 65, 97, 72]
>>> for i in range(len(numbers)):
... if numbers[i] % 3 == 0 and numbers[i] % 5 == 0:
... numbers[i] = 'fizzbuzz'
... elif numbers[i] % 3 == 0:
... numbers[i] = 'fizz'
... elif numbers[i] % 5 == 0:
... numbers[i] = 'buzz'
...
>>> numbers
['fizzbuzz', 22, 14, 'buzz', 97, 'fizz']

rango le permite acceder a los elementos con los números de índice y es una herramienta útil para algunas situaciones. Pero en este caso, en el que desea obtener el índice y el valor de cada elemento, al mismo tiempo, una solución más elegante utiliza enumerate ():

>>> numbers = [45, 22, 14, 65, 97, 72]
>>> for i, num in enumerate(numbers):
... if num % 3 == 0 and num % 5 == 0:
... numbers[i] = 'fizzbuzz'
... elif num % 3 == 0:
... numbers[i] = 'fizz'
... elif num % 5 == 0:
... numbers[i] = 'buzz'
...
>>> numbers
['fizzbuzz', 22, 14, 'buzz', 97, 'fizz']

Para cada elemento, enumerate () devuelve un contador y el valor del elemento. El contador de defecto a 0, que convenientemente es también el índice del elemento. No desee iniciar su conteo a 0? Sólo tiene que utilizar el parámetro opcional inicio para establecer una compensación:

>>> numbers = [45, 22, 14, 65, 97, 72]
>>> for i, num in enumerate(numbers, start=52):
... print(i, num)
...
52 45
53 22
54 14
55 65
56 97
57 72

Al utilizar el parámetro de inicio, tenemos acceso a todos los mismos elementos, comenzando con el primer índice, pero ahora nuestra cuenta empieza desde el valor entero especificado.

Uso listas por comprensión lugar de mapa () y el filtro ()

“Creo que dejando caer filtro () y el mapa () es bastante controvertido [.]”

Guido van Rossum, de Python creador

Él puede tener equivocado acerca de que sea controvertido, pero Guido tenía buenas razones para querer mapa remove () y el filtro () de Python. Una de las razones es que Python lista soporta por comprensión, que a menudo son más fáciles de leer y apoyan la misma funcionalidad que un mapa () y el filtro ().

Primero vamos a echar un vistazo a cómo nos estructuramos una llamada para mapear () y la lista equivalente de comprensión:

>>> numbers = [4, 2, 1, 6, 9, 7]
>>> def square(x):
... return x*x
...
>>> list(map(square, numbers))
[16, 4, 1, 36, 81, 49]

>>> [square(x) for x in numbers]
[16, 4, 1, 36, 81, 49]

ambos enfoques, el mapa () y la comprensión de lista, devuelve los mismos valores, pero la lista de comprensión es más fácil de leer y entender.

Ahora podemos hacer lo mismo para el filtro () y su lista equivalente de comprensión:

>>> def is_odd(x):
... return bool(x % 2)
...
>>> list(filter(is_odd, numbers))
[1, 9, 7]

>>> [x for x in numbers if is_odd(x)]
[1, 9, 7]

Al igual que vimos con el mapa (), el filtro () y la lista de la comprensión acerca devolver el mismo valor, pero la lista de comprensión es más fácil seguir.

Los desarrolladores que provienen de otros idiomas pueden estar en desacuerdo de que las listas por comprensión son más fáciles de leer que map () y el filtro (), pero en mi experiencia principiantes son capaces de recoger las listas por comprensión mucho más intuitiva. De cualquier manera

, Rara vez sale mal uso de listas por comprensión en una entrevista de codificación, como se le indique que sabes lo que es más común en Python.

depuración con punto de interrupción () En lugar de impresión ()

Es posible que haya depurado un pequeño problema mediante la adición de impresión () al código y ver lo que se imprime. Este enfoque funciona bien al principio, pero rápidamente se vuelve muy complicada. Además, en un entorno de codificación entrevista, apenas se desea imprimir () llama salpicada en todo el código.

En su lugar, usted debe utilizar un depurador. Para errores no triviales, es casi siempre más rápido que el uso de impresión (), y dado que la depuración es una parte importante de la escritura de software, se nota que sabe cómo utilizar las herramientas que le permitirán desarrollar rápidamente en el trabajo.

Si está utilizando Python 3.7, usted no necesita importar nada y sólo puede llamar a punto de interrupción () en el lugar en el código donde desea colocar en el depurador:

# Some complicated code with bugs

breakpoint()

Calling punto de interrupción () lo hará que poner en AP, que es el depurador de Python por defecto. En Python 3.6 y más, puede hacer lo mismo con la importación de AP de manera explícita:

import pdb; pdb.set_trace()

Como punto de interrupción (), pdb.set_trace () le pondrá en el depurador PDB. Es que no es tan limpio y es un poco más para recordar.

Hay disponibles otros depuradores que es posible que desee probar, pero AP es parte de la biblioteca estándar, por lo que es siempre disponible. Cualquiera que sea depurador lo prefiere, vale la pena ponerlas en práctica para acostumbrarse al flujo de trabajo antes de que esté en un ambiente de la entrevista de codificación. Las cadenas de formato

con F-Strings

Python tiene un montón de diferentes maneras de cadena mango formato, y puede ser difícil saber qué usar. De hecho, abordamos el formato en profundidad en dos artículos separados: uno sobre el formato de cadenas en general y uno centrado específicamente en f-cuerdas. En una entrevista de codificación, donde te (esperemos) usando Python 3.6 o superior, el enfoque sugerido es el formato F-cadenas de Python.

f-cuerdas admite el uso del formato de cadenas de mini-lenguaje, así como de gran alcance interpolación de cadenas. Estas características le permiten añadir variables o expresiones Python aún válidos y hacer que se evalúan en tiempo de ejecución antes de ser añadido a la cadena:

>>> def get_name_and_decades(name, age):
... return f"My name is {name} and I'm {age / 10:.5f} decades old."
...
>>> get_name_and_decades("Maria", 31)
My name is Maria and I'm 3.10000 decades old.

el F-string le permite poner María en la cadena y añadir su edad con el formato deseado en uno sucinta la operación.

El principal riesgo a tener en cuenta es que si usted está la salida de los valores generados por el usuario, a continuación, que pueden introducir riesgos de seguridad, en cuyo caso la plantilla Cuerdas puede ser una opción más segura.

listas Ordenar complejo con ordenados ()

Un montón de preguntas de la entrevista de codificación requieren algún tipo de clasificación, y hay varias maneras válidas que puede ordenar los elementos. A menos que el entrevistador quiere que permite implementar su propio algoritmo de clasificación, por lo general es mejor utilizar ordenados ().

Usted probablemente ha visto los usos más simples de clasificación, como ordenar las listas de números o cadenas en orden ascendente o descendente:

>>> sorted([6,5,3,7,2,4,1])
[1, 2, 3, 4, 5, 6, 7]

>>> sorted(['cat', 'dog', 'cheetah', 'rhino', 'bear'], reverse=True)
['rhino', 'dog', 'cheetah', 'cat', 'bear]

Por defecto, ordenados () ha ordenado la entrada en orden ascendente, y el argumento de palabra clave inversa hace que se ordenar en orden descendente. el valor de

Es saber acerca de la clave argumento de palabra clave opcional que permite especificar una función que será llamada de todos los elementos antes de la clasificación. Adición de una función que permite reglas de ordenación personalizada, que son especialmente útiles si quieres a los tipos de datos tipo más complejo:

>>> animals = [
... {'type': 'penguin', 'name': 'Stephanie', 'age': 8},
... {'type': 'elephant', 'name': 'Devon', 'age': 3},
... {'type': 'puma', 'name': 'Moe', 'age': 5},
... ]
>>> sorted(animals, key=lambda animal: animal['age'])
[
{'type': 'elephant', 'name': 'Devon', 'age': 3},
{'type': 'puma', 'name': 'Moe', 'age': 5},
{'type': 'penguin', 'name': 'Stephanie, 'age': 8},
]

Al pasar de una función lambda que vuelve la edad de cada elemento, se puede ordenar una lista de diccionarios por un solo valor de cada uno de los diccionarios. En este caso, el diccionario está ordenada de forma ascendente por la edad.

Aprovechar las estructuras de datos con eficacia

algoritmos reciben mucha atención en las entrevistas de codificación, pero las estructuras de datos son, posiblemente, aún más importante. En un contexto de codificación de entrevistas, recogiendo la estructura de datos adecuada puede tener un impacto importante en el rendimiento. estructuras de datos teórica

Más allá, Python tiene funcionalidad de gran alcance y conveniente incorporado en sus implementaciones de la estructura de datos estándar. Estas estructuras de datos son muy útiles en las entrevistas de codificación porque te dan un montón de funcionalidad por defecto y permiten dedicar su tiempo a otras partes del problema. Valores

tienda únicos con conjuntos de

A menudo se tendrá que quitar los elementos duplicados de una base de datos existente. Los nuevos desarrolladores a veces hacerlo con listas cuando deberían estar utilizando conjuntos, que hacen cumplir la singularidad de todos los elementos.

Haz de cuenta que tiene una función llamada get_random_word (). Siempre devolverá una selección aleatoria de un pequeño conjunto de palabras:

>>> import random
>>> all_words = "all the words in the world".split()
>>> def get_random_word():
... return random.choice(all_words)

Se supone que get_random_word llamada () varias veces para obtener 1.000 palabras al azar y luego regresar una estructura de datos que contiene cada palabra única. Aquí hay dos común, subóptima y se aproxima a uno de los enfoques buena.

enfoque malo get_unique_words

() almacena los valores en una lista a continuación, convierte la lista en un conjunto:

>>> def get_unique_words():
... words = []
... for _ in range(1000):
... words.append(get_random_word())
... return set(words)
>>> get_unique_words()
{'world', 'all', 'the', 'words'}

Este enfoque no es terrible, pero innecesariamente crea una lista y luego la convierte en un conjunto. Los entrevistadores casi siempre previo aviso (y preguntar sobre) este tipo de elección de diseño.

Enfoque Peor

Para evitar la conversión de una lista a un conjunto, que ahora almacenar valores en una lista sin necesidad de utilizar cualquier otra estructura de datos. A continuación, probar la singularidad mediante la comparación de nuevos valores con todos los elementos que participan actualmente en la lista:

>>> def get_unique_words():
... words = []
... for _ in range(1000):
... word = get_random_word()
... if word not in words:
... words.append(word)
... return words
>>> get_unique_words()
['world', 'all', 'the', 'words']

Esto es peor que el primer enfoque, ya que hay que comparar cada nueva palabra en contra de toda palabra que ya están en la lista. Eso significa que a medida que el número de palabras crece, el número de operaciones de búsqueda crece de forma cuadrática. En otras palabras, la complejidad crece tiempo del orden de O (N ²).

buen enfoque

Ahora, que evite el uso de listas por completo y en su lugar utilizar un conjunto desde el principio:

>>> def get_unique_words():
... words = set()
... for _ in range(1000):
... words.add(get_random_word())
... return words
>>> get_unique_words()
{'world', 'all', 'the', 'words'}

Esto puede no parecer muy diferente de los otros enfoques, excepto para hacer uso de un conjunto de principios. Si se tiene en cuenta lo que está sucediendo dentro de .add (), aún suena como el segundo enfoque: correr la voz, cheque si ya está en el conjunto, y si no, agregarlo a la estructura de datos.

Entonces por qué está utilizando un conjunto diferente de la segunda aproximación? diferente de

Es porque los conjuntos almacenar elementos en una manera que permite controles constante de tiempo cerca de si un valor está en el conjunto o no, a diferencia de las listas, que requieren operaciones de búsqueda en tiempo lineal. La diferencia en las medias de tiempo de búsqueda que la complejidad de tiempo para añadir a un conjunto crece a un ritmo de O (N), que es mucho mejor que el O (N $ ² $) a partir de la segunda aproximación en la mayoría de los casos.

Almacenar memoria con los generadores de

Lista

comprensiones son herramientas convenientes, pero a veces puede conducir a la utilización de la memoria innecesaria.

Imagínese que le han pedido para encontrar la suma de los primeros 1.000 cuadrados perfectos, comenzando con 1. Usted sabe acerca de las listas por comprensión, por lo que el código rápidamente una solución de trabajo:

>>> sum([i * i for i in range(1, 1001)])
333833500

Su solución hace una lista de cada cuadrado perfecto entre 1 y 1.000.000 y las sumas de los valores. Su código devuelve la respuesta correcta, pero a continuación se inicia el entrevistador aumentando el número de cuadrados perfectos que necesita para resumir.

Al principio, su función sigue apareciendo la respuesta correcta, pero pronto comienza a empeorar hasta que finalmente el proceso parece que se cuelga por una eternidad. Esta es la última cosa que quiere sucediendo en una entrevista de codificación.

¿Qué está pasando aquí?

se trata de hacer una lista de cada cuadrado perfecto que ha solicitado y sumando todos ellos. Una lista con 1.000 cuadrados perfectos puede no ser grande en la computadora-términos, pero 100 millones o 1 mil millones es un poco de información y puede abrumar fácilmente los recursos de memoria disponibles de su PC. Eso es lo que está pasando aquí.

Afortunadamente, hay una forma rápida de resolver el problema de memoria. Usted acaba de cambiar los soportes con paréntesis:

>>> sum((i * i for i in range(1, 1001)))
333833500

el canje de los soportes cambia su lista de comprensión en una expresión generador. Las expresiones generadoras son perfectos para cuando se sabe que desea recuperar datos de una secuencia, pero que no necesitan acceder a todos al mismo tiempo.

En lugar de crear una lista, la expresión devuelve un objeto generador de generador. Ese objeto sabe dónde se encuentra en el estado actual (por ejemplo, I = 49) y sólo calcula el siguiente valor cuando se le pide.

Así que cuando suma itera sobre el objeto generador llamando al siguiente .__ __ () varias veces, los controles del generador lo que es igual, calcula i * i, i incrementos internamente, y devuelve el valor apropiado a la suma. El diseño permite que los generadores que se utilizarán en las secuencias masivas de datos, ya que existe sólo un elemento de memoria a la vez.

Definir valores predeterminados en diccionarios con .get () y .setdefault ()

Una de las tareas de programación común consiste en añadir, modificar o recuperar un elemento que puede o no puede estar en un diccionario. diccionarios de Python tienen funcionalidad elegantes para hacer estas tareas limpia y fácil, pero los desarrolladores a menudo verifican de forma explícita a los valores cuando no es necesario.

Imagine que tiene un diccionario llamado vaquero, y que desea obtener el nombre de ese vaquero. Un enfoque consiste en comprobar explícitamente de la llave con un condicional:

>>> cowboy = {'age': 32, 'horse': 'mustang', 'hat_size': 'large'}
>>> if 'name' in cowboy:
... name = cowboy['name']
... else:
... name = 'The Man with No Name'
...
>>> name
'The Man with No Name'

este enfoque primero comprueba si existe la clave nombre en el diccionario, y si es así, devuelve el valor correspondiente. De lo contrario, devuelve un valor predeterminado.

Mientras que el registro de forma explícita para las llaves funciona, puede ser fácilmente sustituida por una línea si se utiliza .get ():

>>> name = cowboy.get('name', 'The Man with No Name')

get () realiza las mismas operaciones que se realizaron en el primer enfoque, pero ahora son manejados automáticamente. Si existe la clave, a continuación, se devolverá el valor adecuado. De lo contrario, conseguirá devuelto el valor predeterminado.

Pero lo que si desea actualizar el diccionario con un valor por defecto, mientras todavía acceso a la clave de nombre? .get () en realidad no le ayuda aquí, por lo que te queda comprobar explícitamente el valor nuevo:

>>> if 'name' not in cowboy:
... cowboy['name'] = 'The Man with No Name'
...
>>> name = cowboy['name']

la comprobación de valor y establecer un valor por defecto es un enfoque válido y es fácil de leer, pero una vez más ofertas de Python un método más elegante, con .setdefault ():

>>> name = cowboy.setdefault('name', 'The Man with No Name')

.setdefault () logra exactamente el mismo que el fragmento anterior. Se comprueba si existe el nombre de vaquero, y si es así devuelve ese valor. De lo contrario, se establece vaquero [ ‘nombre para el hombre sin nombre y devuelve el nuevo valor.

se aprovechan de forma predeterminada biblioteca estándar

Por Python, Python viene con una gran cantidad de funcionalidad que es sólo una declaración de importación de distancia. Es poderoso por sí mismo, pero saber cómo aprovechar la biblioteca estándar puede impulsar el potencial de sus habilidades de entrevista de codificación.

Es difícil elegir las piezas más útiles de todos los módulos disponibles, por lo que esta sección se centrará en sólo un pequeño subconjunto de sus funciones de utilidad. Con suerte, estos serán de utilidad para usted en entrevistas y también abrir el apetito para aprender más sobre la funcionalidad avanzada de estos y otros módulos de codificación.

manija Missing Claves de diccionario Con collections.defaultdict ()

.get () y .setdefault () funcionan bien cuando se está configurando un valor predeterminado para una sola llave, pero es normal que desee un valor predeterminado para todas las claves posibles no se ha establecido , especialmente cuando se programa en un contexto de la entrevista de codificación.

Imagina que tienes un grupo de estudiantes, y hay que hacer un seguimiento de sus calificaciones en sus tareas. El valor de entrada es una lista de tuplas con el formato (student_name, grado), pero desea buscar fácilmente todos los grados para un solo estudiante sin iterar sobre la lista.

Una forma de almacenar los datos de grado utiliza un diccionario que mapea nombres de los estudiantes a las listas de los grados:

>>> student_grades = {}
>>> grades = [
... ('elliot', 91),
... ('neelam', 98),
... ('bianca', 81),
... ('elliot', 88),
... ]
>>> for name, grade in grades:
... if name not in student_grades:
... student_grades[name] = []
... student_grades[name].append(grade)
...
>>> student_grades
{'elliot': [91, 88], 'neelam': [98], 'bianca': [81]}

En este enfoque, iterar sobre los estudiantes y comprobar si sus nombres están ya propiedades en el diccionario. Si no es así, que los agrega al diccionario con una lista vacía como el valor predeterminado. A continuación, anexar sus calificaciones reales a la lista de calificaciones del estudiante.

Pero hay un enfoque más limpio incluso que utiliza un defaultdict, que amplía la funcionalidad dict estándar que le permite establecer un valor predeterminado que será operado en si no existe la clave:

>>> from collections import defaultdict
>>> student_grades = defaultdict(list)
>>> for name, grade in grades:
... student_grades[name].append(grade)

En este caso, se está creando un defaultdict que utiliza el constructor de la lista () sin argumentos como un método de fábrica por defecto. list () sin argumentos devuelve una lista vacía, lista () si el nombre no existe y luego permite que el grado que se añadirán llama así defaultdict. Si usted desea conseguir la suposición, también se puede utilizar una función lambda como su valor de fábrica para devolver una constante arbitraria.

aprovechando una defaultdict puede conducir a la aplicación de limpieza de código, ya que no tiene que preocuparse de valores por defecto en el nivel clave. En su lugar, puede manejarlos vez a nivel defaultdict y luego actuar como si la clave está siempre presente.

Count Hashable objetos con collections.Counter

Usted tiene una larga cadena de palabras sin cartas de puntuación o de capital y desea contar cuántas veces cada una aparece la palabra.

Se puede usar un diccionario o defaultdict e incrementar los conteos, pero collections.Counter proporciona una forma más limpia y más conveniente para hacer exactamente eso. Counter es una subclase de dict que utiliza 0 como el valor predeterminado para cualquier elemento que falta y hace que sea más fácil contar las apariciones de objetos:

>>> from collections import Counter
>>> words = "if there was there was but if \
... there was not there was not".split()
>>> counts = Counter(words)
>>> counts
Counter({'if': 2, 'there': 4, 'was': 4, 'not': 2, 'but': 1})

Cuando se pasa en la lista de palabras para contrarrestar, almacena cada palabra junto con un recuento de la cantidad de veces que la palabra se produjo en la lista.

¿Tienes curiosidad por lo que fueron los dos mayoría de las palabras comunes? Sólo tiene que utilizar .most_common ():

>>> counts.most_common(2)
[('there', 4), ('was', 4)]

.most_common () es un método de conveniencia y simplemente devuelve las entradas de n más frecuentes según el recuento. Grupos de cuerdas

de acceso común Con el tiempo trivia constantes de cadena

de él! Es ‘A’ > ‘a’ verdadero o falso? falsa por parte del

, porque el código ASCII para A es 65, pero es un 97 y 65 no es mayor que 97.

¿Por qué la materia respuesta? Porque si usted quiere comprobar si un personaje es parte del alfabeto Inglés, una forma popular es ver si es entre A y Z (65 y 122 en la tabla ASCII).

Comprobación de los trabajos de código ASCII, pero es torpe y fácil echar a perder en las entrevistas de codificación, especialmente si usted no puede recordar si en minúsculas o en mayúsculas caracteres ASCII son lo primero. Es mucho más fácil de utilizar las constantes definidas como parte del módulo de cadena.

Se puede ver que está en uso en is_upper (), que devuelve si todos los caracteres de una cadena son letras mayúsculas: is_upper

>>> import string
>>> def is_upper(word):
... for letter in word:
... if letter not in string.ascii_uppercase:
... return False
... return True
...
>>> is_upper('Thanks Geir')
False
>>> is_upper('LOL')
True

() Repite las letras en la palabra, y comprueba si las cartas son parte de string.ascii_uppercase. Si imprime string.ascii_uppercase verá que es sólo una cadena humilde. El valor se establece en el literal ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’.

Todas las constantes de cadena son sólo las cadenas de valores de cadena que se hace referencia con frecuencia. Estos incluyen los siguientes:

  • string.ascii_letters
  • string.ascii_uppercase
  • string.ascii_lowercase
  • string.digits
  • string.hexdigits
  • string.octdigits
  • string.punctuation
  • string.printable
  • cadena. espacios en blanco

Estos son más fáciles de usar y, aún más importante, más fácil de leer.

generar permutaciones y combinaciones con itertools

entrevistadores amor para dar escenarios de la vida real para hacer la codificación de las entrevistas parecen menos intimidante, así que aquí está un ejemplo artificioso: vas a un parque de atracciones y decide averiguar cada posible par de amigos que podrían sentarse juntos en una montaña rusa.

A menos que la generación de estos pares es el principal propósito de la pregunta de la entrevista, lo más probable es que la generación de todos los posibles pares es sólo un paso tedioso en el camino hacia un algoritmo de trabajo. Se podría calcular por sí mismo con anidado de-bucles, o puede utilizar la biblioteca de gran alcance itertools.

itertools tiene múltiples herramientas para la generación de secuencias iterables de datos de entrada, pero ahora vamos sólo se centran en dos funciones comunes: itertools.permutations (itertools.combinations) y ().

itertools.permutations () crea una lista de todas las permutaciones, lo que significa que hay una lista de todas las posibles agrupación de valores de entrada con una longitud que coincide con el parámetro de recuento. El argumento r palabra clave nos permite especificar el número de valores de ir en cada agrupación:

>>> import itertools
>>> friends = ['Monique', 'Ashish', 'Devon', 'Bernie']
>>> list(itertools.permutations(friends, r=2))
[('Monique', 'Ashish'), ('Monique', 'Devon'), ('Monique', 'Bernie'),
('Ashish', 'Monique'), ('Ashish', 'Devon'), ('Ashish', 'Bernie'),
('Devon', 'Monique'), ('Devon', 'Ashish'), ('Devon', 'Bernie'),
('Bernie', 'Monique'), ('Bernie', 'Ashish'), ('Bernie', 'Devon')]

Con permutaciones, el orden de los asuntos elementos, por lo que ( ‘Sam’, ‘Devon’) representa una pareja diferente de ( ‘Devon’, ‘sam ‘), lo que significa que ambos estarían incluidos en la lista.

itertools.combinations () construye combinaciones. Estos son también los posibles agrupamientos de los valores de entrada, pero ahora el orden de los valores, no importa. Debido a que ( ‘Sam’, ‘Devon’) y ( ‘Devon’, ‘Sam’) representan la misma pareja, sólo uno de ellos se incluirían en la lista de salida:

>>> list(itertools.combinations(friends, r=2))
[('Monique', 'Ashish'), ('Monique', 'Devon'), ('Monique', 'Bernie'),
('Ashish', 'Devon'), ('Ashish', 'Bernie'), ('Devon', 'Bernie')]

Dado que el orden de los valores no importa con combinaciones, hay menos combinaciones que permutaciones para la misma lista de entrada. Una vez más, porque nos propusimos r a 2, cada grupo tiene dos nombres en el mismo. .combinations

() y (.permutations) son sólo pequeños ejemplos de una biblioteca de gran alcance, pero incluso estas dos funciones pueden ser muy útiles cuando se está tratando de resolver un problema algoritmo rápidamente.

Conclusión: Codificación Entrevista Superpoderes

Ahora puede sentirse cómodo usando algunos de menos común de Python, pero las características más potentes, estándar en su entrevista de codificación siguiente. Hay mucho que aprender sobre el lenguaje como un todo, pero este artículo en caso de que le han dado un punto de partida para ir más profundo, mientras que le permite utilizar Python más eficazmente cuando se entrevista.

En este artículo, usted ha aprendido diferentes tipos de herramientas estándar para sobrealimentar sus habilidades de entrevista de codificación:

  • Potente funciones integradas de estructuras
  • de datos construidos para manejar escenarios comunes con casi ningún código de paquetes de bibliotecas
  • estándar que tienen soluciones ricas en características para problemas específicos, lo que le permite escribir mejor código más rápido

la entrevista puede no ser la mejor aproximación de desarrollo de software real, pero vale la pena saber cómo tener éxito en cualquier entorno de programación, incluso entrevistas. Afortunadamente, aprender a usar Python durante las entrevistas de codificación puede ayudar a entender el lenguaje más profundamente, que pagará dividendos durante el desarrollo del día a día.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *