我有一个类似于以下的东西
retval = {}
# ...
# some code here to fetch data
# ...
for row in cursor.fetchall():
if row.someid not in retval:
retval[row.someid] = [dict(zip(columns,rows))]
else:
retval[row.someid].append(dict(zip(columns,rows))
这将产生:
retval = {
1: [{'someid': 1, 'samplefield': 'valueX', ... },
{'someid': 1, 'samplefield': 'valueY', ... }],
2: [{'someid': 2, 'samplefield': 'valueX', ... }]
}
我觉得有更符合Python风格的方法来达到我需要的结果。
确切地说,是否有一种方法可以减少这些代码行:
if row.someid not in retval:
retval[row.someid] = [dict(zip(columns,rows))]
else:
retval[row.someid].append(dict(zip(columns,rows))
如何将内容放在单行中?
答案: 其实在文档中早就有了!感谢Christian Ternus和chthonicdaemon指点我正确的方向。我更新了这篇文章,因为我发现文档中有多种方法可以实现。
from collections import defaultdict
retval = defaultdict(list) ## Or retval = defaultdict(lambda: []) based on my accepted answer.
# ...
# some code here to fetch data
# ...
for row in cursor.fetchall():
retval[row.someid].append(dict(zip(columns,rows))
或者
retval = {}
# ...
# some code here to fetch data
# ...
for row in cursor.fetchall():
retval.setdefault(row.someid, []).append(dict(zip(columns,rows))
希望这篇文章能像对我有帮助一样,对你也有所裨益!
defaultdict(list)
比使用lambda
更好一些。 - chthonicdaemonlist
似乎更加直观,因为list
的行为与lambda: []
完全相同。构建一个返回值的函数涉及到比仅仅传递对现有对象的引用更多的机制。 - chthonicdaemon