极客/书呆子/同胞Python教徒借给我你的耳朵!
我在Python 2.7中编写了一个使用set()函数的脚本。这是一种内置数据结构,仅用于存储唯一值。但是我在不同的环境中运行脚本。我知道我应该在与生产环境相同的环境中编码。所以在生产环境中有一个古老版本的python运行。据我所知,这是Python 2.2。此外,这个Python解释器在Java虚拟机(JVM)上运行,这使得这个Jython成为可能。很酷。 :)无论如何,无论出于何种原因,此版本的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上。看起来2.2.1是你的WLST附带的,但谷歌建议you may be able to use WLST with Jython 2.7。如果你可以使用2.7,这可能是一个比2.2更好的环境。 (它仍然非常符合非Jython标准,但它超过了2.2。)
如果这不可行,仍然不要使用列表。回到set
不存在时,做套装的方法是用dict
你忽略了它的值。与set
相同的时间复杂性,不像你试图使用list
工作时得到的那样。在内置的sets
类型之前出现的旧set
模块实际上是作为dicts的包装器实现的,如果你在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
我建议你使用dict的键。只需将值设置为轻量级,如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
,这是原始Greg Wilson实施的一个小分支,sets
也是一个分支。