有没有比"for“循环更好的方法来访问JSON文件中的值?

mbyulnm0  于 2023-10-21  发布在  其他
关注(0)|答案(3)|浏览(103)

我有一个JSON文件,看起来像这样:

[{'data': [{'text': 'add '},
   {'text': 'Stani, stani Ibar vodo', 'entity': 'entity_name'},
   {'text': ' songs in '},
   {'text': 'my', 'entity': 'playlist_owner'},
   {'text': ' playlist '},
   {'text': 'música libre', 'entity': 'playlist'}]},
 {'data': [{'text': 'add this '},
   {'text': 'album', 'entity': 'music_item'},
   {'text': ' to '},
   {'text': 'my', 'entity': 'playlist_owner'},
   {'text': ' '},
   {'text': 'Blues', 'entity': 'playlist'},
   {'text': ' playlist'}]},
 {'data': [{'text': 'Add the '},
   {'text': 'tune', 'entity': 'music_item'},
   {'text': ' to the '},
   {'text': 'Rage Radio', 'entity': 'playlist'},
   {'text': ' playlist.'}]}]

我想为这个列表中的每个“数据”附加“文本”中的值。
我尝试了以下方法:

lst = []

for item in data:
    p = item['data']
    p_st = ''
    for item_1 in p:
        p_st += item_1['text'] + ' '
    lst.append(p_st)

print(lst)

Out: ['add  Stani, stani Ibar vodo  songs in  my  playlist  música libre ', 'add this  album  to  my   Blues  playlist ', 'Add the  tune  to the  Rage Radio  playlist. ']

它可以工作,但我是JSON的新手,我想知道是否有更好的方法来做到这一点?可能是JSON的一些内置方法或库?

0ve6wy6x

0ve6wy6x1#

您的代码可以很好地从JSON数据中提取文本值。但是,如果你想要一种更简洁的方式来实现相同的结果,你可以在Python中使用列表解析,这可以使你的代码更短,更可读。你可以这样做:

使用JSON模块和列表解析

import json

data = [{'data': [{'text': 'add '}, {'text': 'Stani, stani Ibar vodo', 'entity': 'entity_name'}, {'text': ' songs in '}, {'text': 'my', 'entity': 'playlist_owner'}, {'text': ' playlist '}, {'text': 'música libre', 'entity': 'playlist'}]},
        {'data': [{'text': 'add this '}, {'text': 'album', 'entity': 'music_item'}, {'text': ' to '}, {'text': 'my', 'entity': 'playlist_owner'}, {'text': ' '}, {'text': 'Blues', 'entity': 'playlist'}, {'text': ' playlist'}]},
        {'data': [{'text': 'Add the '}, {'text': 'tune', 'entity': 'music_item'}, {'text': ' to the '}, {'text': 'Rage Radio', 'entity': 'playlist'}, {'text': ' playlist.'}]}]

text_values = [' '.join(item['text'] for item in entry['data']) for entry in data]

print(text_values)

使用pandas

import pandas as pd

data = [{'data': [{'text': 'add '}, {'text': 'Stani, stani Ibar vodo', 'entity': 'entity_name'}, {'text': ' songs in '}, {'text': 'my', 'entity': 'playlist_owner'}, {'text': ' playlist '}, {'text': 'música libre', 'entity': 'playlist'}]},
        {'data': [{'text': 'add this '}, {'text': 'album', 'entity': 'music_item'}, {'text': ' to '}, {'text': 'my', 'entity': 'playlist_owner'}, {'text': ' '}, {'text': 'Blues', 'entity': 'playlist'}, {'text': ' playlist'}]},
        {'data': [{'text': 'Add the '}, {'text': 'tune', 'entity': 'music_item'}, {'text': ' to the '}, {'text': 'Rage Radio', 'entity': 'playlist'}, {'text': ' playlist.'}]}]

# Create a DataFrame from the data
df = pd.DataFrame(data)

# Extract and join the 'text' values for each 'data' entry
text_values = df['data'].apply(lambda x: ' '.join(item['text'] for item in x))

print(text_values.tolist())

如果您计划对JSON数据执行额外的数据分析或操作,则pandas方法更适合,因为它提供了一种强大而灵活的方式来处理结构化数据。

y3bcpkx1

y3bcpkx12#

这里没有特殊的JSON工具可以帮助你,因为你已经解析了JSON,并且有了普通的Python dict s和list s和str s(不,解析过程不能以任何简单的方式修改来做你想要的事情,这应该在解析之后完成)。
也就是说,你的代码是不习惯的,并且有一些效率低下的地方(CPython * 试图 * 帮助解决这些问题,但是对str的重复连接的优化是脆弱的,不可移植的,并且仍然比正确使用str.join更糟糕)。改进后的代码看起来像这样:

lst = [' '.join([item_1['text'] for item_1 in item['data']])
       for item in data]
print(lst)

它使用列表解析来生成外部列表,其中生成的每个元素都是item'data'的所有'text'值的空格分隔连接。在外部使用一个listcomp使事情变得更快(这是一个微优化,利用了listcomp的解释器优化,但它不是大O改进)。' '.join * 的使用是 * 一个大O算法的改进;重复的字符串连接是O(n²)(CPython将其优化为几乎O(n) * 有时 *,但不是那么好,并且不可靠),而通过' '.join的批量连接是保证O(n)。如果你的数据只是少量的字符串,如图所示,差异可能可以忽略不计,但代码更简单,更容易阅读/维护。如果数据有 * 许多 * 字符串要连接,这可能会显着提高速度。
注意:这意味着连接的字符串不会以空格结尾。很有可能你并不想要那个尾随的空格,但是如果你真的想要的话,你总是可以把它加回去的;一个额外的连接不会毁了大O

b1uwtaje

b1uwtaje3#

这将工作:

with open(filename,'r+') as file:
    #open and load json file into dict
    file_data = json.load(file)
    #append new data to dict
    file_data[].append(new_data)
    #sets file's current position at offset
    file.seek(0)
    #convert back to json
    json.dump(file_data, file, indent = 4)

相关问题