下面两个表达式似乎与我相同。哪一个更好?
data = [('a', 1), ('b', 1), ('b', 2)]
d1 = {}
d2 = {}
for key, val in data:
# variant 1)
d1[key] = d1.get(key, []) + [val]
# variant 2)
d2.setdefault(key, []).append(val)
结果是一样的,但是哪个版本更好或者更像 Python?
就我个人而言,我发现版本2很难理解,因为对我来说 setdefault 非常难以掌握。如果我理解正确,它将在字典中查找“ key”的值(如果不可用) ,在 dict 中输入“[]”,返回对该值或“[]”的引用,并将“ val”附加到该引用。虽然它肯定是光滑的,但至少不是直观的(至少对我来说)。
在我看来,版本1更容易理解(如果可用,获取“ key”的值,如果不可用,获取“[]”,然后加入由[ val ]组成的列表,并将结果放在“ key”中)。但是,虽然更直观的理解,我担心这个版本的性能较差,所有这些列表创建。另一个缺点是“ d1”在表达式中出现两次,这相当容易出错。可能有一个更好的使用 get 的实现,但是目前我还没有找到它。
我的猜测是,版本2,虽然更难掌握的经验不足,更快,因此更好。意见?