Geeks / Nerds / Fellow Pythonists me prestan sus oídos!

Escribí un script en Python 2.7 que usa la función set (). Esta es una estructura de datos integrada para almacenar solo valores únicos. Sin embargo, estoy ejecutando el script en un entorno diferente. Sé que debería estar codificado en el mismo entorno que el entorno de producción. Entonces, en el entorno de producción hay una versión antigua de Python corriendo. Por lo que entiendo, esto es Python 2.2. Además, este intérprete de Python se ejecuta en una máquina virtual Java (JVM) que hace que este Jython. Muy genial. :) De todos modos, por cualquier razón, la estructura de datos set () no está incluida en esta versión de Python. ¿De todos modos puedo crear mi propio conjunto usando una lista y luego buscar solo valores únicos? Este tipo de escritura de algoritmos está actualmente sobre mi cabeza. ¿Podría alguien señalarme en una dirección útil?

Al ejecutar este código, veo que la versión es Python 2.2.

import sys
print sys.version_info

Este código devuelve: (2, 2, 1, 'final', 0)

Mi código que arroja el error es:

machine_set = set() #create a set, an empty set at that

El error que recibo es el siguiente:

<me@linuxbox ~>$ java -cp $WEBLOGIC weblogic.WLST lolcats.py

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

Problem invoking WLST - Traceback (innermost last):
  File "/home/oracle/lolcats.py", line 18, in ?
TypeError: set() takes at least 2 arguments (0 given)
0
user3870315 8 sep. 2018 a las 02:24

3 respuestas

La mejor respuesta

Primero, es posible que no esté atascado en Jython 2.2. Parece que 2.2.1 es lo que viene con su WLST, pero Google sugiere que puede usar WLST con Jython 2.7. Si puede usar 2.7, es probable que sea un entorno mucho más agradable que 2.2. (Todavía está bastante anticuado para los estándares que no son de Jython, pero supera a 2.2).


Si eso no es viable, aún así, no use una lista. Cuando set no existía, la forma de hacer conjuntos era con un dict del que ignorarías los valores. Complejidad al mismo tiempo que un set, a diferencia de lo que obtendrías si intentaras usar list para el trabajo. El antiguo sets módulo que vino antes del módulo integrado { El tipo {X5}} en realidad se implementó como una envoltura alrededor de los dictos, y si estuvieras en 2.3, recomendaría sets.Set, pero estás en 2.2.

# Add a value
d[val] = None

# Remove a value
del d[val]

# Check if a value exists (good thing it's not 2.1, or you'd need has_key)
key in d
5
user2357112 supports Monica 7 sep. 2018 a las 23:49

Recomendaría usar las teclas de un dict para su conjunto. Simplemente configure los valores en algo ligero, como 1.

2
gilch 7 sep. 2018 a las 23:27

Python 2.3-2.7 tiene un sets (que está en desuso en 2.6+, porque los nuevos componentes set y frozenset hacen lo mismo pero mejor).

No tiene esto en 2.2, pero el módulo está implementado en Python puro. Entonces, suponiendo que respete la licencia de Python, puede simplemente cópielo de la fuente 2.3 en su proyecto. De hecho, tengo un código en un proyecto antiguo que comienza con esto:

try:
    set
except NameError:
    try:
        from sets import Set as set
    except ImportError:
        from sets23 import Set as set

... lo que implica que solo copiar 2.3 sets.py en su proyecto como sets23.py funciona para 2.2. Pero no tengo un 2.2 para probar, así que ... no prometo que funciona sin ningún tipo de portabilidad, pero creo que lo hace.


Alternativamente, esas clases históricas de conjuntos anteriores a 2.3 mencionadas en los documentos sets todavía están disponibles en el Colección de recetas ActiveState. No todo se ha migrado al repositorio de GitHub (o, si es tiene, la nueva búsqueda no está completa), pero puedo ver { {X1}}, que es una bifurcación menor de la implementación original de Greg Wilson de la que sets también es una bifurcación.

1
abarnert 8 sep. 2018 a las 00:00