Как свернуть мой собственный набор в древнем Python / Jython? - PullRequest
0 голосов
/ 08 сентября 2018

Вундеркинды / Ботаники / Товарищи Питонисты одолжите мне ваши уши!

Я написал скрипт на Python 2.7, который использует функцию set (). Это встроенная структура данных для хранения только уникальных значений. Однако я запускаю сценарий в другой среде. Я знаю, что должен быть закодирован в той же среде, что и производственная среда. Таким образом, в производственной среде существует древняя версия Python. Из того, что я понимаю, это Python 2.2. Кроме того, этот интерпретатор Python работает на виртуальной машине Java (JVM), которая делает этот Jython. Очень круто. :) В любом случае, по какой-то причине структура данных set () не включена в эту версию Python. Могу ли я в любом случае создать свой собственный набор, используя список, а затем искать только уникальные значения? Этот тип написания алгоритма в настоящее время у меня над головой. Может ли кто-нибудь указать мне полезное направление?

При запуске этого кода я вижу, что версия Python 2.2.

import sys
print sys.version_info

Этот код возвращает: (2, 2, 1, 'final', 0)

Мой код, который выдает ошибку:

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

Я получаю следующую ошибку:

<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)

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Я бы порекомендовал использовать ключи dict для вашего набора. Просто установите значения на что-то более легкое, например 1.

0 голосов
/ 08 сентября 2018

Python 2.3-2.7 имеет модуль sets (который устарел в 2.6+, потому что новые встроенные функции set и frozenset делают то же самое, но лучше).

У вас этого нет в 2.2, но модуль реализован на чистом Python. Итак, если вы уважаете лицензию Python , вы можете просто скопировать ее из исходного кода 2.3 в свой проект. На самом деле у меня есть некоторый код в древнем проекте, который начинается с этого:

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

… что означает, что просто скопировать 2,3 sets.py в ваш проект как sets23.py работает для 2.2. Но у меня нет версии 2.2 для тестирования, поэтому… я не буду обещать , что она работает без какого-либо портирования, но я думаю это делает.


Кроме того, те исторические классы набора до 2.3, упомянутые в sets документах, по-прежнему доступны в коллекции рецептов ActiveState . Не все были перенесены в репозиторий GitHub (или, если это так, новый поиск не завершен), но я вижу 106469_Yet_another_Set_class_for_Python, который является второстепенным форком оригинальной реализации Грега Уилсона, sets также является форком.

0 голосов
/ 08 сентября 2018

Во-первых, вы не можете застрять на Jython 2.2. Похоже, что 2.2.1 - это то, что поставляется с вашим WLST, но Google предлагает, чтобы вы могли использовать WLST с Jython 2.7 . Если вы можете использовать 2.7, это, вероятно, будет намного лучше, чем 2.2. (Это все еще довольно устарело по стандартам, не относящимся к Jython, но оно намного лучше 2.2.)


Если это нежизнеспособно, не используйте список. Назад, когда set не существовало, способ сделать наборы был с dict, значения которого вы игнорировали бы. Сложность по времени такая же, как у set, в отличие от того, что вы получите, если попытаетесь использовать list для этой работы. Старый модуль sets, предшествовавший встроенному типу set, был фактически реализован как оболочка для диктовок, и если бы вы работали с 2.3, я бы порекомендовал sets.Set, но вы ' на 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
...