我正在尝试将dict值扩展到python 2.6中的列表中。当我运行扩展时,我没有将所有字典值放入列表中。我错过了什么?
def cld_compile(ru,to_file,cld):
a = list()
p = subprocess.Popen(ru, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
a = p.stdout.readlines()
p.wait()
if (p.returncode != 0):
os.remove(to_file)
clderr = dict()
clderr["filename"] = cld
clderr["errors"] = a[1]
return clderr
def main():
clderrors = list()
<removed lines>
cldterr = cld_compile(ru,to_file,cld)
clderrors.extend(cldterr)
cldterr的返回值:
print cldterr
{'errors': 'fail 0[file.so: undefined symbol: Device_Assign]: library file.so\r\n', 'filename': '/users/home/ili/a.pdr'}
当我尝试将cldterr扩展到列表clderrors时,我只得到:
print clderrors
['errors', 'filename']
答案 0 :(得分:3)
dict.__iter__
遍历字典的所有KEYS而不提供值,因此对于类似的内容:
d = {'a':1, 'b':2, 'c':3}
for element in d:
print(element)
# "a"
# "b"
# "c"
这就是list.extend
仅为您提供密钥"errors"
和"filename"
的原因。你想要它给你什么,是更好的问题?我甚至不确定应该如何工作 - 也许是(key,value)
的元组?要做到这一点,请访问dict.items()
,这将为您提供dict_items
对象,每次迭代产生(key,value)
:
使用相同的例子:
for element in d.items():
print(element)
# ("a",1)
# ("b",2)
# ("c",3)
或者在你的情况下:
for key,value in cldterr.items():
clderrors.append((key,value))
# or if you want future programmers to yell at you:
# [clderrors.append(key,value) for key,value in cldterr.items()]
# don't use list comps for their side effects! :)
或者简单地说:
clderrors.extend(cldterr.items())
答案 1 :(得分:2)
它是因为.extend()
期望一个序列,你想使用期望一个对象的append()
。
例如
>>> l = list()
>>> d = dict('a':1, 'b':2}
>>> l.extend(d)
['a', 'b']
>>> l2 = list()
>>> l2.append(d)
[{'a':1, 'b':2}]
在Python中迭代字典时,你将它的键作为一个序列,因此当使用extends()
时,只将字典键添加到列表中 - 因为Python要求迭代时得到的相同迭代器for
循环中的字典。
>>> for k in d:
print k
a
b
答案 2 :(得分:1)
是。它是预期的,当你通过它的名字访问字典时,它只会迭代密钥。如果您希望字典值在列表中,您可以执行以下操作:
errList={'errors': 'fail 0[file.so: undefined symbol: Device_Assign]: library file.so\r\n', 'filename': '/users/home/ili/a.pdr'}
l= [(i +" "+ d[i]) for i in errList]
print l
否则,您可以访问字典作为元组列表:
print errList.items()