Para los lenguajes de programación en general, buscaría las bibliotecas de expresiones regulares de su idioma u otro soporte de “expresiones regulares”. También podría usar ese enfoque para Python. Sin embargo, hay un enfoque más elegante para algo como esto.
Dé su lista de nombres que desea filtrar para aquellos elementos que contienen un carácter inicial que está en el conjunto de letras: ‘a’ hasta ‘f’ (o ‘A’ hasta ‘F’ – no fue completamente consistente en ese punto en su pregunta. Resulta que el enfoque “funcional” puede reducir ese requisito a una sola expresión:
names_to_print = filter (lambda x: x [0] en ‘abcdef’, nombres)
Analicemos esto: esta declaración vincula names_to_print a los resultados de llamar a la función incorporada del filtro Python. Esa función toma dos argumentos. El primer argumento es algún tipo de objeto “invocable”: una función, ciertos tipos de instancias de clase (que implementan el método especial __call __ () ) o, como en este caso, una expresión lambda . Esta expresión lambda particular toma un solo argumento (llamado x y lo evalúa en términos de una expresión; esa expresión es x [0] (tome el primer carácter) en ‘abcdef’ (pruebe si es una subcadena de esa secuencia de letras) La función filter () evalúa ese invocable para cada elemento de una lista ( nombres en nuestro ejemplo) y devuelve solo aquellos elementos para los que las evaluaciones devuelven cualquier valor “verdadero” (que, en Python, es principalmente cualquier cosa que no sea 0, False , Ninguno , ni vacío).
- ¿Soy el único que piensa en lo que voy a pensar antes de pensarlo?
- Voy a dejar mi trabajo en 5 días, ¿podría aconsejarme sobre cómo mantenerme enfocado en mi pasión sin mirar atrás?
- Amo cantar pero soy muy malo en eso. ¿Mejorará mi canto con el tiempo o es que solo algunas personas son bendecidas con este talento?
- No necesito aprender a tocar un acorde de re mayor cada vez que toco uno. ¿Cuál es un buen sitio web que tiene acordes de guitarra para canciones populares por nombre de acorde y no por pestañas?
- Quiero invertir en acciones de Apple. ¿Es aconsejable invertir en acciones de Apple? ¿Cuánto debería invertir?
Para imprimirlos sin vincular los resultados a una variable (posiblemente temporal), podríamos simplemente unirlos en una sola cadena, pasando eso a nuestra declaración de impresión (Python 2.xy anterior) o la función incorporada print () (Python 3. x o Python 2.7 después de __future__ import print_function ). Aquí hay un ejemplo:
print (‘\ n \ t’.join (filtro (lambda x: x [0] en’ abcdefABCDEF ‘, nombres))
… También me colé en un ejemplo de cómo extender esto para que coincida con las letras mayúsculas y las minúsculas … aunque también podría haber usado minúsculas (x [0] en ‘abcdef’ en la expresión lambda para no distinguir mayúsculas y minúsculas.
Casi cada vez que pregunta “¿cómo verifico por …?” (a través del contenido de cualquier tipo de lista o colección) debería considerar usar algún tipo de filtro () … tal vez la función itertools.ifilter () de las bibliotecas estándar. (La ventaja de ifilter () sobre el filtro () incorporado es que realiza una “evaluación perezosa” en lugar de asignar “ansiosamente” espacio y calcular el contenido de todo el conjunto de resultados; esto se vuelve importante a mayor escala) escalas. Por lo tanto, la conciencia de la evaluación “perezosa” versus “ansiosa” es una habilidad para cultivar).
También puede usar las comprensiones de listas (ansiosas) o las expresiones generadoras (evaluadas perezosamente) de esta manera:
# Comprensión de la lista:
fnames = [i para i en nombres si i [0] en ‘abcdef’]
# Expresión del generador:
generate_names = (i para i en nombres si i [0] en ‘abcdef’)
para cada uno de los nombres_generados:
imprimir (cada uno)
En este caso muestro cómo usar los resultados de la expresión del generador en un bucle. El objeto devuelto por la expresión es un “generador” … un bit de código que implementa un método ” .next () ” y algo de lógica para calcular / suministrar los valores para las llamadas posteriores a ese método.
Por cierto, estos métodos de filtro (ansioso o vago, comprensión y generador) también podrían usarse con funciones del módulo re (expresión regular) de Python. En algunos casos, convertir nuestra cadena ‘abcdef’ en un conjunto podría ofrecer un rendimiento marginalmente mejor que dejarlo como una cadena. (En general, los conjuntos están optimizados para la prueba de membresía, mientras que las búsquedas de subcadenas son más generales y no están optimizadas para las pruebas de membresía de un solo carácter; por otro lado, es extremadamente improbable que haga alguna diferencia para una cadena tan corta, incluso si estaba filtrando listas de miles de nombres ) (Si estuviéramos usando set (‘abcdef’ ), el resto de nuestro código no cambiaría. La sintaxis para probar la pertenencia a un conjunto es idéntica para probar si existe una subcadena en otra cadena).