2014-03-26 101 views
2

我想擴展一個字典值到Python 2.6中的列表當我運行擴展我沒有得到所有的字典值到列表中。我錯過了什麼?Python擴展字典值列表

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'] 

回答

1

dict.__iter__貫穿字典的所有按鍵不給值,所以是這樣的:

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

是。預計,當您通過名稱訪問字典時,它只會遍歷鍵。如果你想字典中的值是在列表中,你可以這樣做:

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