Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建值为列表的字典最优雅的方法是什么?_Python - Fatal编程技术网

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纳秒,我个人认为人类读者更容易理解,这才是最重要的。