2016-01-05 19 views
0

我使用Redis的-PY(PIP安裝Redis的),以獲取列表:Redis的值需要轉換爲快譯通

r_server = redis.Redis("localhost") 
r_list = [] 
len = r_server.llen("test") 
for item in range(r_server.llen("test")): 
    r_list.append(r_server.rpop("test")) 
print r_list 
for r in r_list: 
    print r 
    print type(r) 

結果:

["{'a': 1, 'b': 2}", "{'a': 2, 'b': 3}"] 
{'a': 1, 'b': 2} 
<type 'str'> 
{'a': 2, 'b': 3} 
<type 'str'> 

的問題的類型是string 但我想要一個dict

因爲我必須這樣做:

match = [dct for dct in r_list if int(dct["a"]) >=0 ] 

這將導致錯誤:TypeError: string indices must be integers, not str

我怎樣才能把它轉換?

回答

1

您正在尋找ast.literal_eval

設置爲RPOP命令的響應回調ast.literal_eval

import ast 
r_server.set_response_callback('RPOP', ast.literal_eval) 

,或者你在循環接收Redis的列表中的每個元素調用ast.literal_eval

from ast import literal_eval 

r_list = [] 

for item in range(r_server.llen("test")): 
    r_list.append(literal_eval(r_server.rpop("test"))) 

當然,你可以也使用eval,但ast.literal_eval更安全。

0

我嘗試以下操作:

>>> v = ["{'a': 1, 'b': 2}", "{'a': 2, 'b': 3}"] 
>>> import ast 
>>> ast.literal_eval(v[0]) 
{'a': 1, 'b': 2} 

>>> d = ast.literal_eval(v[0]) 
>>> d['a'] 
1 
>>> 

要修改你的情況下,你必須在一開始做進口,而是打印內容R的能打印ast.literal_eval(R)。

對於您的'匹配'聲明,我會採取兩步法(並檢查字典是否有正確的密鑰)。

0

如果你不關心安全性,只需使用內置的eval()。

 
v = ["{'a': 1, 'b': 2}", "{'a': 2, 'b': 3}"] 
res = [eval(x) for x in v] 
print(res) 

回報

 
[{'a': 1, 'b': 2}, {'a': 2, 'b': 3}]