我在Redis中存储一个列表,如下所示:
redis.lpush('foo', [1,2,3,4,5,6,7,8,9])
然后我把这个列表拿回来了:
redis.lrange('foo', 0, -1)
我得到这样的东西:
[b'[1, 2, 3, 4, 5, 6, 7, 8, 9]']
如何将其转换为实际的Python列表?
另外,我在RESPONSE_CALLBACKS
中没有看到任何可以帮助的内容?我错过了什么吗?
可能的解决方案(在我看来很糟糕)可以是:
result = redis.lrange('foo',0, -1)[0].decode()
result = result.strip('[]')
result = result.split(', ')
# lastly, if you know all your items in the list are integers
result = [int(x) for x in result]
的更新 的
好的,所以我得到了解决方案。
实际上,lpush
函数需要将所有列表项作为参数传递,而不是作为单个列表传递。来自redis-py源的函数签名清楚地表明了......
def lpush(self, name, *values):
"Push ``values`` onto the head of the list ``name``"
return self.execute_command('LPUSH', name, *values)
我上面所做的是发送一个列表作为参数,然后将其作为SINGLE项发送到redis。
我应该按照答案中的建议解压缩列表:
redis.lpush('foo', *[1,2,3,4,5,6,7,8,9])
返回我期望的结果......
redis.lrange('foo', 0, -1)
[b'9', b'8', b'7', b'6', b'5', b'4', b'3', b'2', b'1']
答案 0 :(得分:22)
我认为你会遇到类似于 list.append()和 list.extend()之间区别的语义。我知道这对我有用:
myredis.lpush('foo', *[1,2,3,4])
...注意列表前面的*(map-over)运算符!
答案 1 :(得分:2)
另一种方式:您可以使用RedisWorks
库。
pip install redisworks
>>> from redisworks import Root
>>> root = Root()
>>> root.foo = [1,2,3,4,5,6,7,8,9] # saves it to Redis as a list
...
>>> print(root.foo) # loads it from Redis later
它将python类型转换为Redis类型,反之亦然。因此,即使你有嵌套列表,它也会起作用:
>>> root.sides = [10, [1, 2]] # saves it as list in Redis.
>>> print(root.sides) # loads it from Redis
[10, [1, 2]]
>>> type(root.sides[1])
<class 'list'>
免责声明:我写了这个库。以下是代码:https://github.com/seperman/redisworks
答案 2 :(得分:0)
import json
r = [b'[1, 2, 3, 4, 5, 6, 7, 8, 9]']
rstr = r[0]
res_list = json.loads(rstr)
答案 3 :(得分:-2)
实际上这个问题重复了这个: How to push a whole sequence to redis in Python。问题及其解决方案完全相同 - 为了正确获取列表数据,我们应该首先以正确的方式推送。