Usando 'in' para que coincida con un atributo de los objetos de Python en una matriz -- python campo con arrays campo con iteration camp Relacionados El problema

Using 'in' to match an attribute of Python objects in an array


51
vote

problema

Español

No recuerdo si estaba soñando o no, pero parece que me recuerdo que hay una función que permitió algo como,

  foo in iter_attr(array of python objects, attribute name)  

He mirado por encima de los documentos, pero este tipo de cosas no se cae debajo de ningún encabezado indicado obvio

Original en ingles

I don't remember whether I was dreaming or not but I seem to recall there being a function which allowed something like,

foo in iter_attr(array of python objects, attribute name)

I've looked over the docs but this kind of thing doesn't fall under any obvious listed headers

</div
        

Lista de respuestas

43
 
vote
vote
La mejor respuesta
 

El uso de una lista de la lista de la lista construiría una lista temporal, que podría comer toda su memoria si la secuencia que se está buscando es grande. Incluso si la secuencia no es grande, construyendo la lista significa que iteran sobre toda la secuencia antes de PasswordSaltDesignedForThisQuestion11111 podría iniciar su búsqueda.

La lista temporal puede evitarse usando una expresión del generador:

  PasswordSaltDesignedForThisQuestion2  

Ahora, siempre y cuando PasswordSaltDesignedForThisQuestion3 CERCA DEL INICIO DE PasswordSaltDesignedForThisQuestion4 , la búsqueda será rápida, incluso si PasswordSaltDesignedForThisQuestion5 es infinitamente largo. < / p>

Como sugirió @matt, es una buena idea usar PasswordSaltDesignedForThisQuestion6

Si alguno de los objetos en PasswordSaltDesignedForThisQuestion7 puede faltar un atributo password_hash()18 :

  PasswordSaltDesignedForThisQuestion9  
 

Using a list comprehension would build a temporary list, which could eat all your memory if the sequence being searched is large. Even if the sequence is not large, building the list means iterating over the whole of the sequence before in could start its search.

The temporary list can be avoiding by using a generator expression:

foo = 12 foo in (obj.id for obj in bar) 

Now, as long as obj.id == 12 near the start of bar, the search will be fast, even if bar is infinitely long.

As @Matt suggested, it's a good idea to use hasattr if any of the objects in bar can be missing an id attribute:

foo = 12 foo in (obj.id for obj in bar if hasattr(obj, 'id')) 
</div
 
 
12
 
vote

¿Está buscando obtener una lista de objetos que tengan un cierto atributo? Si es así, una la comprensión de la lista es la forma correcta de hacer esto.

  String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 0  
 

Are you looking to get a list of objects that have a certain attribute? If so, a list comprehension is the right way to do this.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')] 
</div
 
 
10
 
vote

Siempre podrías escribir uno mismo:

  String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 1  

trabajará con cualquier cosa que iba, sea una tupla, lista o lo que sea.

Amo a Python, hace que las cosas sean tan simples y no más de una molestia que la necesaria, y en uso, como este es enormemente elegante.

 

you could always write one yourself:

def iterattr(iterator, attributename):     for obj in iterator:         yield getattr(obj, attributename) 

will work with anything that iterates, be it a tuple, list, or whatever.

I love python, it makes stuff like this very simple and no more of a hassle than neccessary, and in use stuff like this is hugely elegant.

</div
 
 
7
 
vote

No, no estabas soñando. Python tiene un sistema de comprensión de la lista bastante excelente que le permite manipular las listas con bastante elegancia, y dependiendo de exactamente lo que quiere lograr, esto se puede hacer un par de maneras. En esencia, lo que está haciendo es decir "para el artículo en la lista si los criterios.matches", y de eso, puede itular a través de los resultados o descargar los resultados en una nueva lista.

Voy a ir a cuna de bucear en Python aquí, porque es bastante elegante Y son más inteligentes de lo que soy. Aquí están recibiendo una lista de archivos en un directorio, luego filtrando la lista para todos los archivos que coincidan con un criterio de expresión regular.

      files = os.listdir(path)                                    test = re.compile("test.py$", re.IGNORECASE)               files = [f for f in files if test.search(f)]   

Podría hacerlo sin expresiones regulares, por su ejemplo, para cualquier cosa donde su expresión al final regrese verdadera para una coincidencia. Hay otras opciones como usar la función Filtro (), pero si iba a elegir, iría con esto.

Eric Sipple

 

No, you were not dreaming. Python has a pretty excellent list comprehension system that lets you manipulate lists pretty elegantly, and depending on exactly what you want to accomplish, this can be done a couple of ways. In essence, what you're doing is saying "For item in list if criteria.matches", and from that you can just iterate through the results or dump the results into a new list.

I'm going to crib an example from Dive Into Python here, because it's pretty elegant and they're smarter than I am. Here they're getting a list of files in a directory, then filtering the list for all files that match a regular expression criteria.

    files = os.listdir(path)                                    test = re.compile("test.py$", re.IGNORECASE)               files = [f for f in files if test.search(f)] 

You could do this without regular expressions, for your example, for anything where your expression at the end returns true for a match. There are other options like using the filter() function, but if I were going to choose, I'd go with this.

Eric Sipple

</div
 
 
6
 
vote

La función en la que está pensando es probablemente operator.attrgettter . Por ejemplo, para obtener una lista que contenga el valor del atributo "ID" de cada objeto:

  import operator ids = map(operator.attrgetter("id"), bar)  

Si desea verificar si la lista contiene un objeto con un ID == 12, entonces, una forma limpia y limpia (I.E. no iteration, la lista completa innecesariamente), es:

  any(obj.id == 12 for obj in bar)  

Si desea utilizar 'In' con Atragter, mientras que aún conserva la iteración perezosa de la lista:

  import operator,itertools foo = 12 foo in itertools.imap(operator.attrgetter("id"), bar)   
 

The function you are thinking of is probably operator.attrgettter. For example, to get a list that contains the value of each object's "id" attribute:

import operator ids = map(operator.attrgetter("id"), bar)

If you want to check whether the list contains an object with an id == 12, then a neat and efficient (i.e. doesn't iterate the whole list unnecessarily) way to do it is:

any(obj.id == 12 for obj in bar)

If you want to use 'in' with attrgetter, while still retaining lazy iteration of the list:

import operator,itertools foo = 12 foo in itertools.imap(operator.attrgetter("id"), bar) 
</div
 
 
5
 
vote

Lo que estaba pensando puede lograrse usando las explicaciones de la lista, pero pensé que había una función que hizo esto de una manera un poco más tranquilo.

es. 'Bar' es una lista de objetos, todos los cuales tienen el atributo 'ID'

la forma ambiental mítica:

  foo = 12 foo in iter_attr(bar, 'id')  

La lista de comprensión de la lista:

  foo = 12 foo in [obj.id for obj in bar]  

En retrospectiva, la lista de comprensión de la lista es bastante limpia de todos modos.

 

What I was thinking of can be achieved using list comprehensions, but I thought that there was a function that did this in a slightly neater way.

i.e. 'bar' is a list of objects, all of which have the attribute 'id'

The mythical functional way:

foo = 12 foo in iter_attr(bar, 'id')

The list comprehension way:

foo = 12 foo in [obj.id for obj in bar]

In retrospect the list comprehension way is pretty neat anyway.

</div
 
 
3
 
vote

Si planea buscar algo de tamaño remotamente decente, su mejor apuesta va a usar un diccionario o un conjunto. De lo contrario, básicamente tiene que iterar a través de todos los elementos del iterador hasta que llegue a la que desea.

Si este no es necesariamente un código sensible al rendimiento, entonces la lista de comprensión de la lista debería funcionar. Pero tenga en cuenta que es bastante ineficiente porque pasa por encima de todos los elementos del iterador y luego vuelve a hacerlo de nuevo hasta que encuentre lo que quiere.

Recuerde, Python tiene uno de los algoritmos de hashing más eficientes. Úsalo a tu favor.

 

If you plan on searching anything of remotely decent size, your best bet is going to be to use a dictionary or a set. Otherwise, you basically have to iterate through every element of the iterator until you get to the one you want.

If this isn't necessarily performance sensitive code, then the list comprehension way should work. But note that it is fairly inefficient because it goes over every element of the iterator and then goes BACK over it again until it finds what it wants.

Remember, python has one of the most efficient hashing algorithms around. Use it to your advantage.

</div
 
 
0
 
vote

creo:

  #!/bin/python bar in dict(Foo)   

es en lo que estás pensando. Al intentar ver si existe una cierta clave dentro de un diccionario en Python (versión de Python de una tabla Hash), hay dos formas de comprobar. El primer método has_key()1 se adjunta al diccionario y el segundo es el ejemplo dado anteriormente. Devolverá un valor booleano.

Eso debería responder a su pregunta.

y ahora un poco fuera del tema para atar esto a la visualización de la lista responder previamente (para un poco más de claridad). Lista de comprensiones Construya una lista de un bucle básico con modificadores. Como ejemplo (para aclarar ligeramente), una forma de usar el constructo if bar in value2 en una comprensión :

:

Di que tiene un diccionario bidimensional foo y solo desea los diccionarios de la segunda dimensión que contienen la tecla bar . Una forma relativamente sencilla de hacerlo sería usar una comprensión de lista con un condicional de la siguiente manera:

  #!/bin/python baz = dict([(key, value) for key, value in foo if bar in value])   

Nota el if bar in value Al final de la declaración **, esta es una cláusula de modificación que le dice a la comprensión de la lista para mantener solo aquellos Pares de valor clave que se encuentran con el condicional. ** En este caso baz es un nuevo diccionario que contiene solo los diccionarios de Foo que contienen barra (ojalá no se perdí Cualquier cosa en ese ejemplo de código ... Es posible que tenga que echar un vistazo a la lista de la documentación de comprensión encontrada en Docs.python.org tutorials y en secnetix.de , ambos sitios son buenas referencias si tiene preguntas en el futuro).

 

I think:

#!/bin/python bar in dict(Foo) 

Is what you are thinking of. When trying to see if a certain key exists within a dictionary in python (python's version of a hash table) there are two ways to check. First is the has_key() method attached to the dictionary and second is the example given above. It will return a boolean value.

That should answer your question.

And now a little off topic to tie this in to the list comprehension answer previously given (for a bit more clarity). List Comprehensions construct a list from a basic for loop with modifiers. As an example (to clarify slightly), a way to use the in dict language construct in a list comprehension:

Say you have a two dimensional dictionary foo and you only want the second dimension dictionaries which contain the key bar. A relatively straightforward way to do so would be to use a list comprehension with a conditional as follows:

#!/bin/python baz = dict([(key, value) for key, value in foo if bar in value]) 

Note the if bar in value at the end of the statement**, this is a modifying clause which tells the list comprehension to only keep those key-value pairs which meet the conditional.** In this case baz is a new dictionary which contains only the dictionaries from foo which contain bar (Hopefully I didn't miss anything in that code example... you may have to take a look at the list comprehension documentation found in docs.python.org tutorials and at secnetix.de, both sites are good references if you have questions in the future.).

</div
 
 
 
 

Relacionados problema

2  Utilizando JavaScript / JQery para generar accesorios  ( Using javascript jquery to generate fixtures ) 
Estoy juntando una herramienta para un colega que ayuda a crear una bonita lista de accesorios. Tengo alrededor de 2/3 a través de la herramienta, recolectand...

0  ¿Cómo obtener el número de índice dentro de $ .click () de jQuery?  ( How to get index number inside click of jquery ) 
$("span.ws_label").click(function() { }) por selector "span.ws_label" Hay 5 elementos seleccionados, Cuando se hace clic en uno de ellos, ¿Cómo sabe...

5  ¿Cómo iteré una colección ILIST ILIST en el orden inverso?  ( How do i iterate a net ilist collection in the reverse order ) 
Tengo un ILIST que contiene elementos (PRIMER PADRE), deben agregarse a un documento de diagrama en el orden inverso para que se agregue el padre por última v...

0  Prólogo de iteración apagado por 1  ( Prolog iteration off by 1 ) 
Tengo un iterador llamado myfor de modo que cuando llame myfor(3,7,X). Quiero que devuelva X = [3, 4, 5, 6, 7] . Sin embargo, este código solo devuelve ...

45  ¿Cómo iterar a través de un arraylist de objetos de arraylist de objetos?  ( How to iterate through an arraylist of objects of arraylist of objects ) 
usando un ejemplo: Diga que tengo una llamada de clase Gun . Tengo otra llamada de clase Bullet . Clase Gun tiene un Lista de Array de Bullet . a...

107  ¿Cuál es la forma más segura de iterar a través de las llaves de un hash de Perl?  ( Whats the safest way to iterate through the keys of a perl hash ) 
Si tengo un hash Perl con un montón de pares (clave, valor), ¿cuál es el método preferido de iteración a través de todas las teclas? He escuchado que el uso d...

51  Usando 'in' para que coincida con un atributo de los objetos de Python en una matriz  ( Using in to match an attribute of python objects in an array ) 
No recuerdo si estaba soñando o no, pero parece que me recuerdo que hay una función que permitió algo como, foo in iter_attr(array of python objects, attri...

3461  ¿Cómo iterarme de manera eficiente sobre cada entrada en un mapa de Java?  ( How do i efficiently iterate over each entry in a java map ) 
Si tengo un objeto que implementa la interfaz Map en Java y deseo iterar sobre cada par contenida en él, ¿cuál es la forma más eficiente de pasar por el map...

0  Necesito ayuda para convertir el patrón iterativo en fórmula  ( Need help converting iterative pattern into formula ) 
var = 8 itr 1: var == 8 (8 * 1) itr 2: var == 24 (8 * 3) itr 3: var == 48 (8 * 6) itr 4: var == 80 (8 * 10) itr 5: var == 120 (8 * 15) Patrón: (VAR ...

10  ¿Cuál es el método más rápido / seguro para iterar sobre un hashset?  ( What is the fastest safest method to iterate over a hashset ) 
Todavía soy bastante nuevo en C #, pero noté las ventajas a través de las publicaciones del foro de Uso de un HashSet en lugar de un 9988777663 en casos e...




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