2016-01-05 2 views
0

Я использую Redis-ру (ПГИ установить 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) 

или позвоните ast.literal_eval по каждому элементу списка Redis вы получаете в петле

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

Чтобы изменить в вашем случае, вы должны сделать импорт в начале и вместо печати г сделать печать ast.literal_eval (г).

Для вашего утверждения 'match', я бы сделал двухэтапный подход (а также проверить, имеет ли словарь правильный ключ).

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}] 
Смежные вопросы