Python地图有链吗?

时间:2011-04-16 01:19:03

标签: python generator

在Python中,可以使用itertools.chain以惰性方式扩展列表:

L = itertools.chain(L1, L2)

是否有一个懒惰的地图“胶合”操作符?即,

M = glue(M1, M2)

,其中

M['blah']

返回

M1['blah'] if 'blah' in M1 else M2['blah']

M具有适用于keys()values()的生成器。

2 个答案:

答案 0 :(得分:5)

Python 3.3添加了collections.ChainMap,确实如此。

答案 1 :(得分:4)

直接构建一个类来表示对地图列表的惰性求值,并根据应用程序定制行为。例如:

from UserDict import DictMixin

class Map(object, DictMixin):
    def __init__(self, *maps):
        self.maps = maps
    def __getitem__(self, key):
        for m in self.maps:
            if key in m:
                return m[key]
    def keys(self):
        return list(self.iterkeys())
    def iterkeys(self):
        return (k for m in self.maps for k in m.iterkeys())
    def values(self):
        return list(self.itervalues())
    def itervalues(self):
        return (v for m in self.maps for v in m.itervalues())

def glue(*maps):
    return Map(*maps)

M1 = {'blah': 1}
M2 = {'duh': 2}

M = glue(M1, M2)
print M['blah']
print M['duh']
print list(M.keys())
print list(M.values())

输出:

1
2
['blah', 'duh']
[1, 2]