如何在远古 Python/Jython 中推出我自己的套装?

How To Roll My Own Set in Ancient Python/Jython?

Geeks/Nerds/FellowPython各位大神们请多多关照!

我在 Python 2.7 中编写了一个使用 set() 函数的脚本。这是一个内置的数据结构,仅用于存储唯一值。不过我运行脚本在不同的环境下。我知道我应该在与生产环境相同的环境中编码。所以在生产环境中出现了古版本的python运行。据我了解,这是 Python 2.2。此外,此 Python 解释器在 Java 虚拟机 (JVM) 上 运行,它构成了此 Jython。很酷。 :) 无论出于何种原因,此版本的 Python 中均未包含 set() 数据结构。 我是否可以使用列表创建自己的集合,然后仅查找唯一值?我目前无法编写此类算法。有人可以指出我有用的方向吗?

当运行这段代码我看到版本是Python2.2。

import sys
print sys.version_info

此代码returns:(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)

首先,您可能不会卡在 Jython 2.2 上。看起来 2.2.1 是您的 WLST 附带的,但 Google 建议 you may be able to use WLST with Jython 2.7。如果您可以使用 2.7,那可能是一个比 2.2 好得多的环境。 (按照非 Jython 标准,它仍然相当过时,但它已经超过了 2.2。)


如果那不可行,还是不要使用列表。当 set 不存在时,做集合的方法是使用 dict 你会忽略其值。与 set 相同的时间复杂度,这与您尝试使用 list 完成工作时的情况不同。在内置 set 类型之前出现的旧 sets 模块实际上是作为对字典的包装器实现的,如果你使用的是 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

我建议您为您的学习集使用字典键。只需将值设置为轻量级的值,例如 1.

Python 2.3-2.7 有一个 sets 模块(在 2.6+ 中已弃用,因为新的内置 setfrozenset 做同样的事情但更好).

你在 2.2 中没有这个,但是这个模块是在纯 Python 中实现的。所以——假设您将 Python license—you can just copy it from the 2.3 source 尊重到您的项目中。事实上,我在一个古老的项目中有一些代码以此开头:

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 可以测试,所以……我不会 保证 它可以在没有任何移植的情况下工作,但我 认为


另外,sets 文档中提到的那些历史 pre-2.3 集 类 在 ActiveState recipes collection. Not everything has been migrated to the GitHub repo (or, if it has, the new search isn't complete), but I can see 106469_Yet_another_Set_class_for_Python 中仍然可用,这是原始 Greg Wilson 实现的一个小分支sets 也是.

的一个分支