Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

193
Views
¿Por qué obtengo tantas iteraciones cuando agrego y elimino de un conjunto mientras itero sobre él?

Tratando de entender el bucle for de Python, pensé que esto daría el resultado {1} para una iteración, o simplemente me quedaría atascado en un bucle infinito, dependiendo de si hace la iteración como en C u otros lenguajes. Pero en realidad no lo hizo.

 >>> s = {0} >>> for i in s: ... s.add(i + 1) ... s.remove(i) ... >>> print(s) {16}

¿Por qué hace 16 iteraciones? ¿De dónde viene el resultado {16} ?

Esto estaba usando Python 3.8.2. En pypy, obtiene el resultado esperado {1} .

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

De la documentación de Python 3:

El código que modifica una colección mientras itera sobre esa misma colección puede ser complicado de hacer bien. En cambio, por lo general es más sencillo recorrer una copia de la colección o crear una nueva colección:

Iterar sobre una copia

 s = {0} s2 = s.copy() for i in s2: s.add(i + 1) s.remove(i)

que debe iterar solo 1 vez

 >>> print(s) {1} >>> print(s2) {0}

Editar: una posible razón para esta iteración es que un conjunto no está ordenado, lo que provoca algún tipo de seguimiento de pila. Si lo hace con una lista y no con un conjunto, simplemente terminará, con s = [1] porque las listas están ordenadas, por lo que el ciclo for comenzará con el índice 0 y luego pasará al siguiente índice, encontrando que no hay 't uno, y salir del bucle.

over 4 years ago · Santiago Trujillo Report

0

Creo que esto tiene algo que ver con la implementación real de conjuntos en python. Los conjuntos usan tablas hash para almacenar sus elementos, por lo que iterar sobre un conjunto significa iterar sobre las filas de su tabla hash.

A medida que itera y agrega elementos a su conjunto, se crean y agregan nuevos valores hash a la tabla hash hasta llegar al número 16. En este punto, el siguiente número se agrega al principio de la tabla hash y no al final. Y dado que ya iteró sobre la primera fila de la tabla, el ciclo de iteración finaliza.

Mi respuesta se basa en esta de una pregunta similar, en realidad muestra exactamente el mismo ejemplo. Realmente recomiendo leerlo para más detalles.

over 4 years ago · Santiago Trujillo Report

0

Python establece una colección desordenada que no registra la posición de los elementos ni el orden de inserción. No hay un índice adjunto a ningún elemento en un conjunto de python. Por lo tanto, no admiten ninguna operación de indexación o división.

Así que no espere que su ciclo for funcione en un orden definido.

¿Por qué hace 16 iteraciones?

user2357112 supports Monica ya explica la causa principal. Aquí, hay otra forma de pensar.

 s = {0} for i in s: s.add(i + 1) print(s) s.remove(i) print(s)

Cuando ejecuta este código, le da este resultado:

 {0, 1} {1, 2} {2, 3} {3, 4} {4, 5} {5, 6} {6, 7} {7, 8} {8, 9} {9, 10} {10, 11} {11, 12} {12, 13} {13, 14} {14, 15} {16, 15} {16}

Cuando accedemos a todos los elementos juntos como un bucle o imprimiendo el conjunto, debe haber un orden predefinido para que atraviese todo el conjunto. Por lo tanto, en la última iteración, verá que el orden cambia de {i,i+1} a {i+1,i} .

Después de la última iteración, sucedió que i+1 ya se atravesó, por lo que se salió del ciclo.

Dato interesante: use cualquier valor menor que 16 excepto 6 y 7 siempre le dará el resultado 16.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!