una seleccionar filas fila extraer como columnas columna python iterator generator

filas - seleccionar un solo elemento de una colección: Python



seleccionar filas pandas (8)

Creé una función de utilidad para devolver el único elemento esperado de una expresión del generador

print one(name for name in (''bob'',''fred'') if name==''bob'')

¿Es esta una buena manera de hacerlo?

def one(g): try: val = g.next() try: g.next() except StopIteration: return val else: raise Exception(''Too many values'') except StopIteration: raise Exception(''No values'')


¿Quieres decir?

def one( someGenerator ): if len(list(someGenerator)) != 1: raise Exception( "Not a Singleton" )

¿Qué estás tratando de lograr con todo el código adicional?


Aquí está mi intento en la función one() . .next() llamada explícita .next() y en su lugar .next() un bucle for.

def one(seq): counter = 0 for elem in seq: result = elem counter += 1 if counter > 1: break if counter == 0: raise Exception(''No values'') elif counter > 1: raise Exception(''Too many values'') return result


Eche un vistazo al método itertools.islice () .

>>> i2=itertools.islice((name for name in (''bob'',''fred'') if name==''bob''),0,1,1) >>> i2.next() ''bob'' >>> i2.next() Traceback (most recent call last): File "<interactive input>", line 1, in <module> StopIteration >>>

Este módulo implementa una serie de bloques de construcción de iteradores inspirados en construcciones de los lenguajes de programación Haskell y SML. Cada uno ha sido refundido en una forma adecuada para Python.

El módulo estandariza un conjunto básico de herramientas rápidas y eficientes en memoria que son útiles por sí mismas o en combinación. La estandarización ayuda a evitar los problemas de legibilidad y confiabilidad que surgen cuando muchas personas diferentes crean sus propias implementaciones levemente variables, cada una con sus propias peculiaridades y convenciones de nomenclatura.

Las herramientas están diseñadas para combinarse fácilmente entre sí. Esto facilita la construcción de herramientas más especializadas de forma sucinta y eficiente en Python puro.


Enfoque simple:

print (name for name in (''bob'', ''fred'') if name == ''bob'').next()

Si realmente quiere un error cuando hay más de un valor, entonces necesita una función. Lo más simple que puedo pensar es ( EDITADO para trabajar con listas también):

def one(iterable): it = iter(iterable) val = it.next() try: it.next() except StopIteration: return val else: raise Exception(''More than one value'')


Primero, (para responder a la pregunta real) su solución funcionará bien al igual que las otras variantes propuestas.

Yo agregaría que en este caso, IMO, los generadores son demasiado complicados. Si esperas tener un valor, probablemente nunca tengas suficiente para preocuparte por el uso de la memoria, así que habría utilizado lo obvio y mucho más claro:

children = [name for name in (''bob'',''fred'') if name==''bob''] if len(children) == 0: raise Exception(''No values'') elif len(children) > 1: raise Exception(''Too many values'') else: child = children[0]


Una solución más simple es usar el desempaquetado de tuplas. Esto ya hará todo lo que desee, incluido el control de que contiene exactamente un elemento.

Objeto unico:

>>> name, = (name for name in (''bob'',''fred'') if name==''bob'') >>> name ''bob''

Demasiados articulos:

>>> name, = (name for name in (''bob'',''bob'') if name==''bob'') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack

No hay artículos:

>>> name, = (name for name in (''fred'',''joe'') if name==''bob'') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: need more than 0 values to unpack


¿Qué hay de usar Python para ... en sintaxis con un contador? Similar a la respuesta desconocida.

def one(items): count = 0 value = None for item in items: if count: raise Exception(''Too many values'') count += 1 value = item if not count: raise Exception(''No values'') return value


Para aquellos que usan o están interesados ​​en una biblioteca de terceros, more_itertools implementa dicha herramienta con el manejo de errores nativos:

> pip install more_itertools

Código

import more_itertools as mit mit.one(name for name in ("bob", "fred") if name == "bob") # ''bob'' mit.one(name for name in ("bob", "fred", "bob") if name == "bob") # ValueError: too many values to unpack (expected 1) mit.one(name for name in () if name == "bob") # ValueError: not enough values to unpack (expected 1, got 0)

Ver more_itertools documentación para más detalles. El código fuente subyacente es equivalente a la respuesta aceptada.