怪胎/书呆子/资深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)
答案 0 :(得分:5)
首先,您可能不会停留在Jython 2.2上。 WLST附带的内容似乎是2.2.1,但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 :(得分:2)
我建议为您的集合使用字典键。只需将值设置为轻量级的值即可,例如1
。
答案 2 :(得分:1)
Python 2.3-2.7有一个sets
模块(在2.6+中已弃用,因为新的内置set
和frozenset
做同样的事情,但效果更好)。
您在2.2中没有此功能,但是该模块是在纯Python中实现的。因此,假设您尊重Python license,则可以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
文档中提到的那些历史早于2.3的集合类在ActiveState recipes collection中仍然可用。并非一切都migrated to the GitHub repo(或者,如果已经完成,则新搜索还没有完成),但是我可以看到106469_Yet_another_Set_class_for_Python
,它是{{1 }}也是它的一个分支。