【问题标题】:How To Roll My Own Set in Ancient Python/Jython?如何在古代 Python/Jython 中滚动我自己的集合?
【发布时间】:2018-09-07 23:24:00
【问题描述】:

Geeks/Nerds/Fellow Pythonists 给我听听!

我在 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)

【问题讨论】:

  • 我希望你已经找到了离开这个古老的 Jython 的迁移路径。
  • 改用字典。设置项成为键,值都是None
  • 字典键基本上是一个集合。您可以创建一个包含空白值的字典并使用成员资格测试吗?你需要这个套装做什么?
  • Python 2.3-2.7sets 库是纯 Python 的,应该与 2.2 兼容,因此您可以将其复制并粘贴到您自己的项目中。
  • @abarnert:只要你尊重许可证。

标签: python jython wlst jython-2.2


【解决方案1】:

首先,您可能不会停留在 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 模块实际上是作为 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

【讨论】:

  • 感谢答案中的详细信息(代码示例)。我会尝试使用字典。另外,感谢您指出有关 WLST 和 Jython 2.7 的文章。我将不得不看看我是否可以获得此更新。 :)
【解决方案2】:

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

【讨论】:

  • 感谢@gilch 的推荐。我会试试这个。 :)
【解决方案3】:

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

您在 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 也是一个分支的。

【讨论】:

  • 太棒了。我可以试试这个。 :D
猜你喜欢
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多