2013-07-18 50 views
-2

我有給我這樣的一個結果通過一個查詢:動態創建字典在Python 2.4

k1=v1 
k2=v2 
k3=v3 
… 

的變量來保存結果是TMP。一旦檢索結果,我只想爲結果創建一個字典。我想:

result={} 
result.update(tmp) 

ValueError: dictionary update sequence element #0 has length 1; 2 is required.

我想這

result.update(tmp.replace("=",":")) 

我得到了同樣的犯錯。 我不想做子串來獲得鍵和值,然後使用d(k1)= v1來構建字典。還有其他的好辦法嗎?我也可以改變查詢,並讓它產生像k1:v1,k2:v2,... 結果如何動態創建一個字典爲此在Python 2.4? 謝謝!

+2

什麼是'tmp'?它應該是一個字典,或者一系列「(鍵,值)」對。你的'tmp'輸入是*既不*,所以錯誤被拋出。 –

+2

順便說一句,你爲什麼使用2.4?這並不影響答案。 – Marcin

+0

如果你真的使用Python 2.4代替,爲什麼用'python-2.7'來標記這個? –

回答

2

如果tmpk1 = v1對,每行一個字符串,你需要分析那些出成對:

result = {} 
for result in query: 
    key, value = result.split('=', 1) 
    result[key.strip()] = value.strip() 

這假設你的查詢返回個人'key1=value1'字符串拆分爲鍵和值對。

只能使用result.update()序列的鍵值對或其他字典。只是傳遞一個字符串不會工作; Python將字符串視爲一個單字符字符串的序列,而單字符字符串不適合鍵值對的要求。

1

您必須將結果字符串拆分爲行,並將每行拆分爲一對字符串。這給你一個dict構造函數的有效輸入:

result = dict(line.strip().split("=", 1) for line in tmp.splitlines()) 
1

這聽起來像你有一個查詢字符串。如果是這樣的話,那麼你最好的朋友是urllib.urldecode()

如果你實際上有一系列換行符,那麼你會想做一些更自定義的事情。

# splitlines will split based on \r or \n or the combination 
pairs = tmp.splitlines() 
# initialize a dict 
output = {} 

for pair in pairs: 
    # split the k/v into two parts, the 1 means only break off the first = 
    k,v = pair.split('=',1) 
    # assign to the output dict. (you may want k.strip and v.strip to clear extra 
    # unneeded whitespace. 
    output[k] = v 

或者,如果你感覺真正看中的,想做到這一切:

dict(map(lambda x: x.strip(),line.strip().split("=", 1)) for line in tmp.splitlines()) 
+0

'urldecode()'也許?爲什麼不包括一個如何工作的樣本? –

+0

...錯字臭。 – cwallenpoole

1

如果查詢的結果可以保存爲Python腳本到一個文件results.py,另一種解決方案是使用execfile

$ cat results.py 
k1="v1" 
k2="v2" 
$ python 
>>> result = {} 
>>> execfile("results.py",{},result) 
>>> print result 
{'k1': 'v1', 'k2': 'v2'}