Python en el orden de los elementos numéricos del conjunto

El desordenado es str.isspace, y el aparentemente ordenado es str.isascii. Excepto por las variables del conjunto de entrada del shell, se muestra en orden, pero ya sea str () o repr () o list (), es no se muestra en orden

print(d['isspace'])
{
    
    5760, 8192, 8194, 8195, 8193, 133, 8196, 8197, 8198, 9, 10, 11, 12, 13, 8199, 8200, 8201, 8202, 12288, 28, 29, 30, 31, 32, 160, 8232, 8233, 8239, 8287}

print(d['isascii'])
{
    
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127}

s='isspace'
r=set()
f=eval('str.%s'%s)
for i in range(0x110000):
    if f(chr(i)):r.add(i)
    
r
Out[95]: 
{
    
    9,
 10,
 11,
 12,
 13,
 28,
 29,
 30,
 31,
 32,
 133,
 160,
 5760,
 8192,
 8193,
 8194,
 8195,
 8196,
 8197,
 8198,
 8199,
 8200,
 8201,
 8202,
 8232,
 8233,
 8239,
 8287,
 12288}

Se supone que el valor hash de longitud variable se usa arriba. Aunque uso la función hash de python, si es un entero positivo, el valor es él mismo. Si está ordenado de acuerdo con él, debería estar en orden, o no es este tipo de tabla hash. En resumen, los números uno al lado del otro son secuenciales.

Pero lo maravilloso:

s=set()
for i in range(100,10,-5):
    s.add(i)
repr(s)
Out[106]: '{65, 35, 100, 70, 40, 75, 45, 15, 80, 50, 20, 85, 55, 25, 90, 60, 30, 95}'
sys.getsizeof(s)
Out[165]: 728
for i in range(10,15):
    s.add(i)
repr(s)
Out[109]: '{10, 11, 12, 13, 14, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100}'
sys.getsizeof(s)
Out[166]: 2264
for i in range(10,15):
    s.remove(i)
repr(s)
Out[115]: '{15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100}'
sys.getsizeof(s)
Out[167]: 2264

Al principio, usé la asignación de flashback, el orden era caótico, y luego copié una serie de números, el pedido se ganó y luego eliminé esos números, los números todavía estaban en orden.

Luego obtuve el tamaño de la colección. El tamaño de la colección inicial es 728, que está fuera de orden. Después de agregar 5 elementos, el orden es 2264. Después de eliminar estos 5 elementos, el orden sigue siendo el pedido y el tamaño sigue siendo 2264 .

Entonces, ¿la colección original es la misma que la colección actual?

s1=set()
for i in range(100,10,-5):
    s1.add(i)

s1==s
Out[169]: True

repr(s1)
Out[170]: '{65, 35, 100, 70, 40, 75, 45, 15, 80, 50, 20, 85, 55, 25, 90, 60, 30, 95}'

repr(s)
Out[171]: '{15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100}'

Naturalmente lo mismo, pero la estructura interna es diferente.

Las tablas hash de diferentes magnitudes se utilizan antes y después. En esta tabla hash, una unidad cubre todos los valores, por lo que esta sección de valores es secuencial, y este conjunto parece usarse directamente como un tipo compuesto secuencial.

Sin embargo, si los elementos agregados no pueden cambiar la magnitud de la tabla hash, siguen siendo unidades dispersas Esta pila de datos parece estar fuera de orden, aunque hay pequeños fragmentos de orden.

La conclusión es que si se trata de una secuencia secuencial con un paso 1 completo, puede usar establecer para ordenar, pero este sigue siendo un enfoque en paralelo. Si hay un paso, ¡no puede estar seguro de si el conjunto generado está en orden!

Supongo que te gusta

Origin blog.csdn.net/jhsxy2005/article/details/113727022
Recomendado
Clasificación