我正在使用 Python 和 Panda3D 框架,并且已经在我们的论坛上提出了这个问题,但是我想我会在更一般的 Python 社区中提问。假设在游戏中我有一个船列表,这里表示为带有 id:string 对的字典。使用制表键可以循环浏览该字典,使用 a 键将向字典添加一个键:值对。在播放过程中,dict 不仅会获得 key:value 对,还会丢失一些,并且必须在扫描前对 dict 进行过滤。
我到目前为止的代码是:
from itertools import cycle, ifilter, ifilterfalse
class GeneratorTest(DirectObject):
def __init__(self):
self.ships = {1:"node1", 2:"node2", 3:"node3", 4:"node4", 5:"node5", 6:"node6", 7:"node7"}
self.ships_iscannable = cycle(ifilter(self.filter_ships, self.ships))
self.accept("tab", self.do_filtered_scan)
self.accept("a", self.add_ship)
def filter_ships(self, n):
scannable = [i for i in self.ships if i != 3]
if n in scannable:
return True
def do_filtered_scan(self):
print self.ships_iscannable.next()
def add_ship(self):
plus_i = sorted(self.ships, reverse=True)[-1] + 1
self.ships[plus_i] = "node%s" % plus_i
print plus_i, self.ships
gt = GeneratorTest()
run()
更糟糕的是,我需要一个 Python 2.5 版本和一个 2.6 版本。后者获得了 .next() 方法,因此 2.5 版本不得不这样做。
任何人都可以帮助我(1)简化 next
两个 Python 版本之间的使用和(2)在添加和删除船舶方面改进代码吗?