Как создать собственный сет на древнем Python/Jython?

Компьютерщики/ботаники/товарищи-питоновцы, одолжите мне свои уши!

Я написал скрипт на 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)

person user3870315    schedule 07.09.2018    source источник
comment
Я надеюсь, что у вас есть путь миграции от этого древнего Jython.   -  person user2357112 supports Monica    schedule 08.09.2018
comment
Вместо этого используйте словарь. Элементы набора становятся ключами, а все значения — None.   -  person Michael Butscher    schedule 08.09.2018
comment
Словарные ключи в основном представляют собой набор. Не могли бы вы просто создать словарь с пустыми значениями и использовать тесты на членство? Для чего нужен набор?   -  person superbeck    schedule 08.09.2018
comment
Библиотека sets с сайта Python 2.3-2.7 написан на чистом Python и должен быть совместим с 2.2, так что вы можете просто скопировать и вставить его в свой собственный проект.   -  person abarnert    schedule 08.09.2018
comment
@abarnert: Пока вы соблюдаете лицензию.   -  person user2357112 supports Monica    schedule 08.09.2018
comment
@abarnet Интересно. Я могу попробовать это, если ничего не работает. Я бы просто добавил свой код в конец этого кода sets или назвал бы этот код модулем, если я могу проявить фантазию в WLST/Jython. Спасибо за крутую идею.   -  person user3870315    schedule 08.09.2018
comment
Наборы @superbeck дают вам уникальные значения. Это очень полезно в определенных ситуациях.   -  person user3870315    schedule 08.09.2018
comment
@ user2357112 Довольно легко соблюдать лицензию для любых версий, кроме 1.6 и 2.1, но да, стоит отметить.   -  person abarnert    schedule 08.09.2018


Ответы (3)


Во-первых, вы можете не застрять на 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
person user2357112 supports Monica    schedule 07.09.2018
comment
Спасибо за подробности (примеры кода) в ответе. Я попробую использовать словарь. Также спасибо за указание на статью о WLST и Jython 2.7. Я должен посмотреть, смогу ли я получить это обновление. :) - person user3870315; 08.09.2018

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

person gilch    schedule 07.09.2018
comment
Спасибо @gilch за рекомендацию. Я попробую это. :) - person user3870315; 08.09.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

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


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

person abarnert    schedule 07.09.2018
comment
Потрясающий. Я могу попробовать это. :D - person user3870315; 08.09.2018