d = {}
for per in a1:
if per.first_name not in d:
d[per.first_name] = []
d[per.first_name].append(per)
for per in a2:
if per.first_name not in d:
d[per.first_name] = []
d[per.first_name].append(per
python中对dict的默认值有设置,详见python doc的dict.setdefault
d = {}
for per in a1:
d.setdefault(per.first_name, []).append(per)
for per in a2:
d.setdefault(per.first_name, []).append(per)
python提供自动创建默认值的结构defaultdict
进一步优化,如下:
d = defaultdict(list)
for per in a1:
d[per.first_name].append(per)
for per in a2:
d[per.first_name].append(per)
熟悉列表推导或者map方法的进一步优化:
d = defaultdict(list)
map(lambda per:d[per.first_name].append(per),a1)
map(lambda per:d[per.first_name].append(per),a2)
d = defaultdict(list)
[d[per.first_name].append(per) for per in a1]
[d[per.first_name].append(per) for per in a2]
还有进一步优化的可能吗?熟悉reduce的朋友可以看下我提供的解决方案,代码如下:
class GroupDict(defaultdict):
def __init__(self, default_factory=list):
'''
@param default_factory: default value generator
'''
super(GroupDict, self).__init__(default_factory)
default_value_type = default_factory if default_factory else list
if issubclass(default_value_type, list) :
self._add_function = default_value_type.append
elif issubclass(default_value_type, set):
self._add_function = default_value_type.add
def append_2_value_collection(self, k, value):
'''
@param k: the key
@param value: the value to add to self[k]
@return: self
@attention: it's important to return self
'''
self._add_function(self[k], value)
return self
那有了这个类,和reduce配合起来就可以像使用jQuery一样链式编写代码了
d = reduce(lambda d, per:d.append_2_value_collection(per.first_name, per), a1, GroupDict())
reduce(lambda d, per:d.append_2_value_collection(per.first_name, per), a2 , d)
for k,v in d.iteritems():
print k ,u"...."
for per in v:
print per