首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中获取列表和JSON输出之间的差异

在python中获取列表和JSON输出之间的差异
EN

Stack Overflow用户
提问于 2019-05-15 13:51:54
回答 3查看 196关注 0票数 2

我正在尝试了解列表的元素和python中JSON数据的输出之间的区别。

我用谷歌搜索了一下,找到了一些答案,但似乎没有一个适合我的场景。

我的代码是

代码语言:javascript
复制
my_new_user_list = json_data.get('0')
print(my_new_user_list)
my_old_user_list = ['user1', 'user2', 'joe', 'doe', 'foo'] 
diff_list = list(set(my_old_user_list) - set(my_new_user_list))

json_data的输出是{'0': "['anonymous', 'joe', 'foo']"}

json_data.get('0')的输出是['anonymous', 'joe', 'foo']

当我尝试获取差异时,它实际上并没有获得两个列表之间的差异,它只是打印my_old_user_list的内容。

如果get('0')返回一个值列表,那么为什么我的脚本不打印两个列表之间的差异。

EN

回答 3

Stack Overflow用户

发布于 2019-05-15 13:59:44

嗯,因为在你的字典里,它看起来像是一个字符串,所以必须使用ast.literal_eval,而不是:

代码语言:javascript
复制
my_new_user_list = json_data.get('0')

执行以下操作:

代码语言:javascript
复制
import ast
my_new_user_list = ast.literal_eval(json_data.get('0'))
票数 1
EN

Stack Overflow用户

发布于 2019-05-15 13:59:58

json_data.get('0')中的列表不是列表,而是字符串

代码语言:javascript
复制
In [24]: json_data = {'0': "['anonymous', 'joe', 'foo']"}                                                                                                                                               

In [25]: type(json_data.get('0'))                                                                                                                                                                       
Out[25]: str

In [26]: set(json_data.get('0'))                                                                                                                                                                        
Out[26]: {' ', "'", ',', '[', ']', 'a', 'e', 'f', 'j', 'm', 'n', 'o', 's', 'u', 'y'}

In [27]: set(['user1', 'user2', 'joe', 'doe', 'foo'])                                                                                                                                                   
Out[27]: {'doe', 'foo', 'joe', 'user1', 'user2'}

因此,当您在this和my_old_user_list之间设置差异时,您会看到旧的列表,因为这两个列表之间没有公共元素。

一种建议是以正确的方式使用列表定义json_data,如下所示的json_data = {'0': ['anonymous', 'joe', 'foo']}

请注意,如果您从某个地方获取数据,则此建议不起作用

代码语言:javascript
复制
#Define value as a list
json_data = {'0': ['anonymous', 'joe', 'foo']}

my_new_user_list = json_data.get('0')

my_old_user_list = ['user1', 'user2', 'joe', 'doe', 'foo']
diff_list = list(set(my_old_user_list) - set(my_new_user_list))
print(diff_list)

输出将是

代码语言:javascript
复制
['user1', 'user2', 'doe']

另一种方法是使用ast.literal_eval将内部字符串解析为列表

(请注意,json.loads将不起作用,因为字符串中有单引号,这将破坏json解析)

如果您要从某个地方获取数据,则此建议应该有效

代码语言:javascript
复制
import ast

json_data = {'0': "['anonymous', 'joe', 'foo']"}

#Use ast.literal_eval to evaluate inner string as a list
my_new_user_list = ast.literal_eval(json_data.get('0'))

my_old_user_list = ['user1', 'user2', 'joe', 'doe', 'foo']
diff_list = list(set(my_old_user_list) - set(my_new_user_list))
print(diff_list)
票数 1
EN

Stack Overflow用户

发布于 2019-05-15 14:01:14

json_data = {"0": "['anonymous', 'joe', 'foo']"}清楚地显示您的字典json_data包含字符串形式的值"['anonymous', 'joe', 'foo']"。您可以尝试以下方法来解决您的问题。以下是您问题中提供的示例的工作代码:

代码语言:javascript
复制
from ast import literal_eval

my_new_user_list = json_data.get('0')

print(type(my_new_user_list))

custom_user_list = literal_eval(json_data.get('0'))

print(type(custom_user_list))

my_old_user_list = ['user1', 'user2', 'joe', 'doe', 'foo'] 

diff_list = list(set(my_old_user_list) - set(custom_user_list))

我从你的代码和我添加的代码中打印了变量的类型。我希望我解决了你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56142515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档