JSON của bạn là một mảng với một đối tượng duy nhất bên trong, vì vậy khi bạn đọc nó trong đó bạn sẽ nhận được một danh sách với một từ điển bên trong. Bạn có thể truy cập từ điển của mình bằng cách truy cập mục 0 trong danh sách, như hiển thị bên dưới:
json1_data = json.loads(json1_str)[0]
Bây giờ bạn có thể truy cập dữ liệu được lưu trữ trong datapoint như bạn mong đợi:
datapoints = json1_data['datapoints']
Tôi có thêm một câu hỏi nếu ai đó có thể cắn: Tôi đang cố lấy trung bình của các phần tử đầu tiên trong các biểu dữ liệu này (tức là các biểu dữ liệu [0] [0]). Chỉ để liệt kê chúng, tôi đã thử thực hiện datapoint [0: 5] [0] nhưng tất cả những gì tôi nhận được là datapoint đầu tiên với cả hai yếu tố trái ngược với việc muốn lấy 5 datapoint đầu tiên chỉ chứa phần tử đầu tiên. Có cách nào để làm việc này không?
datapoints[0:5][0]
không làm những gì bạn mong đợi. datapoints[0:5]
trả về một lát danh sách mới chỉ chứa 5 phần tử đầu tiên, và sau đó thêm [0]
vào phần cuối của nó sẽ chỉ lấy phần tử đầu tiên từ lát danh sách kết quả đó . Những gì bạn cần sử dụng để có được kết quả bạn muốn là một sự hiểu biết danh sách :
[p[0] for p in datapoints[0:5]]
Đây là một cách đơn giản để tính giá trị trung bình:
sum(p[0] for p in datapoints[0:5])/5. # Result is 35.8
Nếu bạn sẵn sàng cài đặt NumPy , thì điều đó thậm chí còn dễ dàng hơn:
import numpy
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)[0]
datapoints = numpy.array(json1_data['datapoints'])
avg = datapoints[0:5,0].mean()
# avg is now 35.8
Sử dụng ,
toán tử với cú pháp cắt cho các mảng NumPy có hành vi mà bạn mong đợi ban đầu với các lát danh sách.