Mantener lista ordenada de elementos mutables hasta la fecha

iago-lito :

Puedo usar sortedo list.sorten Python para ordenar una lista que no se solucionó antes.

Si quiero mi lista permanezca ordenan como añado elementos en ella, puedo usar SortedListdesde el sortedcontainersmódulo.

Sin embargo, no encuentro forma lista para su uso a mantener esta lista clasificada como elementos mutar dentro de ella.

from sortedcontainers import SortedList

a = SortedList([], key=len) # sort elements by their length.
a.add([3,3,3]) # add in..
a.add([1]) # .. random..
a.add([2,2]) # .. order.
print(a) # [[1], [2, 2], [3, 3, 3]] still sorted, okay.

# Now, mutate one element.
a[0].append(1)
a[0].append(1)
print(a) # [[1, 1, 1], [2, 2], [3, 3, 3]] not sorted, not okay.

Entiendo que SortedListno es responsable de seguir los cambios que contenía los elementos y mantener la clasificación hasta la fecha.

¿Cómo se actualiza la clasificación, entonces?
¿Hay un mensaje que puede enviar a apor lo que es consciente de que he hecho un cambio en el índice 0y se reconsidera la ubicación del elemento 0, al igual que a.update_sorting_of(0).
¿Hay alguna otra estructura de datos dedicada a esto?
¿Debo escribir y optimizar yo mismo?
¿Debo trabajar a su alrededor y a.add(a.pop(0))en su lugar?
¿Cómo se compara esta solución a una solución dedicado?

Puedo suponer con seguridad que la mutación a[0]no ha provocado ningún cambio en otros elementos en mi caso (o de lo que lo haría solo a.sort(key=len)todo el asunto).

Reti43:

No existe ningún mecanismo para hacer lo que quiera. Incluso si tuviera que recurrir una lista después de la mutación de un elemento, que tendría O (nlogn) complejidad. Pero debido a add()usos bisecan detrás de las escenas, que sólo tiene O (log n). Así que es mejor hacer algo como usted sugiere, es decir, retirar el elemento a ser mutado y readd. Y si había una función que hizo lo que quería, que probablemente haría algo similar detrás de las escenas, porque no puedo pensar en una mejor manera que bisect para colocar un elemento cuyo orden de clasificación puede haber cambiado.

def mutate_element(sortedlist, index, value):
    temp = sortedlist.pop(index)
    temp.append(value)
    sortedlist.add(temp)

También se podría generalizar aún más la funcionalidad de varios métodos de listas-mutando. Por ejemplo getattr(mylist, 'append')es el mismo que mylist.append.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=351482&siteId=1
Recomendado
Clasificación