[英]How To Roll My Own Set in Ancient Python/Jython?
极客/书呆子/资深Python主义者借给我你的耳朵!
我在Python 2.7中编写了一个使用set()函数的脚本。 这是仅用于存储唯一值的内置数据结构。 但是,我在不同的环境中运行脚本。 我知道我应该在与生产环境相同的环境中进行编码。 因此,在生产环境中,运行着一个古老的python版本。 据我了解,这是Python 2.2。 另外,此Python解释器在创建此Jython的Java虚拟机(JVM)上运行。 很酷。 :)无论出于何种原因,此版本的Python中都不包含set()数据结构。 无论如何,我可以使用列表创建自己的集合,然后仅查找唯一值吗? 这种类型的算法编写目前在我头上。 有人可以指出我的帮助方向吗?
运行此代码时,我看到版本是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)
首先,您可能不会停留在Jython 2.2上。 WLST附带的内容似乎是2.2.1,但Google建议您可以将WLST与Jython 2.7一起使用 。 如果可以使用2.7,则可能是比2.2更好的环境。 (按照非Jython标准,它的日期仍然很旧,但它超过了2.2。)
如果这样做不可行,请不要使用列表。 回到不存在set
时候, set
的方法就是使用一个dict
您会忽略它的值。 与set
相同的时间复杂度,与尝试使用list
进行工作时得到的结果不同。 内置set
类型之前的旧sets
模块实际上是作为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
我建议为您的集合使用字典键。 只需将值设置为轻量级的值即可,例如1
。
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可以测试,所以……我不保证它无需移植就可以工作,但我认为可以。
另外, sets
文档中提到的那些2.3之前的历史集合类仍可在ActiveState配方集合中使用 。 并非一切都已经迁移到GitHub库 (或者,如果有,新的搜索未完成),但我可以看到106469_Yet_another_Set_class_for_Python
,这是原来的格雷格·威尔逊实现,它的一小叉sets
也是一个叉。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.