Python将dict值扩展到列表

时间:2014-03-26 15:24:56

标签: python python-2.6

我正在尝试将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']

3 个答案:

答案 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()