Python 创建值为列表的字典最优雅的方法是什么?
所以我有点像Python 创建值为列表的字典最优雅的方法是什么?,python,Python,所以我有点像 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 = {}
# ...
# 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', ... }]
}
我觉得有一种更像蟒蛇的方式来达到我所需要的结果
准确地说,有没有办法减少这些代码行:
if row.someid not in retval:
retval[row.someid] = [dict(zip(columns,rows))]
else:
retval[row.someid].append(dict(zip(columns,rows))
在一条线上
回答:
一直都是这样!谢谢你给我指明了正确的方向。我更新了这个,因为我发现基于文档可以有多种方法
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))
希望这对你和我都有帮助 尝试使用内置的
collections
模块中的defaultdict
:
从集合导入defaultdict
retval=defaultdict(lambda:[])
# ...
#这里有一些获取数据的代码
# ...
对于cursor.fetchall()中的行:
retval[row.someid].append(dict(zip(列,行))
defaultdict(list)
比使用lambda
要好一点。非常感谢。我将首先在我的实际应用程序中试用它,然后再接受正确的答案。这也相当快!@chthonicdaemon关于defaultdict(list)的原因有具体的原因吗比lambda好吗?@EduardDaduya对我来说似乎更直接一些,因为list
的行为与lambda:[]
完全相同。构造返回值的函数所涉及的机制比传递对现有对象的引用要多得多。@chthonicdaemon-Meh:in[7]:%timeit-defaultdict(list)最慢的运行时间比最快的运行时间长11.56倍。这可能意味着缓存了一个中间结果。10000000个循环,最好是[8]中的每个循环3:165纳秒:%timeit defaultdict(lambda:[])1000000个循环,最好是每个循环3:186纳秒,我个人认为人类读者更容易理解,这才是最重要的。