Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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_Dictionary - Fatal编程技术网

Python字典生成

Python字典生成,python,dictionary,Python,Dictionary,我试图用python编写一个数组值字典,但由于我是python新手,我似乎缺少了一些简单的东西。请有人踢我屁股 所以一个数据 col1, col2 asd, foo asd, bar dsa, baz 应该成为 { asd: ['foo', 'bar'], dsa: ['baz'] } 但是 给出foo 如果我打印行,我可以看到这些行,所以数据就在那里。关闭! 这应该可以解决它 rows = run_query('SELECT * FROM query_datasets')

我试图用python编写一个数组值字典,但由于我是python新手,我似乎缺少了一些简单的东西。请有人踢我屁股

所以一个数据

col1, col2
asd, foo
asd, bar
dsa, baz
应该成为

{
    asd: ['foo', 'bar'],
    dsa: ['baz']
}
但是

给出
foo

如果我打印行,我可以看到这些行,所以数据就在那里。

关闭! 这应该可以解决它

rows = run_query('SELECT * FROM query_datasets')

datasets = {}

for row in rows:
    key = row['col1']
    val = row['col2']
    if not datasets.get(key): # You can use .get() to see if a dict has a key
        datasets[key] = [val]
    else:
        datasets[key].append(val)

return datasets

由于您试图访问
数据集
dict上不存在的键,因此原始代码在运行时不应引发异常

使用
defaultdict
对于您的用例,这是我首选的方法

您可以使用
defaultdict
便利性集合简化很多内容

from collections import defaultdict

# Make datasets a defaultdict that automatically initializes
# an empty list for a key
datasets = defaultdict(list)

rows = run_query('SELECT * FROM query_datasets')

for row in rows:
    datasets[row['col1']].append(row['col2'])
使用EAFP(请求原谅比允许更容易) 在这里,我们依赖于捕获访问字典中不存在的键时抛出的
KeyError
,然后在dict中初始化该值。如果它已经存在,只需附加到我们已经创建的列表中即可

datasets = {}

rows = run_query('SELECT * FROM query_datasets')

for row in rows:
    try:
        datasets[row[0]].append(row[1])
    except KeyError:
        datasets[row[0]] = [row[1]]
使用密钥存在性检查 这里我们检查数据集中的行[0]是否为
。该逻辑与前面的示例类似

rows = run_query('SELECT * FROM query_datasets')

for row in rows:
    if row[0] in datasets:
        datasets[row[0]].append(row[1])
    else:
        datasets[row[0]] = [row[1]]

您的条件
如果不是数据集[row['col1']]:
是错误的。这将从dict中获取该键的元素并检查它是否“真实”,但dict可能还没有该键,因此引发异常。相反,如果行['col1']不在数据集中,则它可能应该是

for row in rows:
    if row['col1'] not in datasets:
        datasets[row['col1']] = []
    datasets[row['col1']].append(row['col2'])
或者,您可以使用
dict.setdefault
设置并返回一个默认值,以防该键尚未在
dict

for row in rows:    
    datasets.setdefault(row['col1'], []).append(row['col2'])

if not datasets[row['col1']]
假设
datasets
已经有了
row['col1']
的条目。由于
数据集
开始时是空的,因此应该立即执行
keyrerror
。@user2357112是否执行此操作?它在我的2.7上运行。那不是一种空支票吗?有点像
if数据集[row['col1']]不是None
。如果row['col1']不在数据集中,请尝试
instead@tobias_k那正是我要找的!谢谢如果你能加上它作为答案,我可以接受。不确定人们为这样一个基本的东西建议模块是怎么回事。这只是在
if
的正文中设置了正确的值?我不需要一个数组吗?我必须收集数组中的所有值。另外,如果找不到键,else将运行,那么它如何附加到不存在的值?我认为
datasets[key]=val
应该是
datasets[key]=[val]
@tobias_k是的,在
if
中也应该是
not
。这更像是一个练习。因此,使用一个库/模块将击败我在这里所说的“学习python”这件事。我一直在寻找自己代码的解决方案。
defaultdict
是标准库的一部分,在某些情况下可以帮助您减少样板文件,但如果您想要更学术的东西,我将用其他一些Pythonic解决方案更新我的答案。我选择了第一个解决方案,因为设置默认值为空会干扰我以后的代码。谢谢@Achshar:
setdefault
并不意味着dict现在永久性地具有一些缺失键的默认值。(也就是说。)
setdefault
表示“获取该键的值,或者如果该键不存在,则插入该值并返回它”。@user2357112是的,我理解,但后面的代码依赖于键存在性检查。因此,如果dict突然在所有键检查中返回true,那么这不是一件好事。@Achshar:但它不会在所有键检查中返回true。@user2357112不会在所有
.get()
调用中返回
[]
?更改字典的默认行为似乎不是正确的做法。
for row in rows:    
    datasets.setdefault(row['col1'], []).append(row['col2'])