python - 我的 140 个元素列表只打印第一个
问题描述
我的代码只打印列表的第一个元素(活动),因为 0; 但是,当我尝试时,[:]
我得到“列表索引必须是整数或切片,而不是 str”类型错误。
我需要打印列表中的 140 个元素,但我真的不知道如何修复它。而且我真的不想编写另一个代码,因为这是我可以在几秒钟内获得两个日期之间差异的唯一方法。
这是我的代码:
import json
import datetime
import copy
#Read json
with open('/Users/kenyacastellanos/Downloads/data.json') as json_data_file:
data = json.load(json_data_file)
print(data)
#Just show first 10 elements
print("Sin ordenar:",data['activities'][:10])
## Realizamos el ordenamiento por llave, la llave es user_id, creamos una funcion lambda para el ordenamiento
data['activities'].sort(key = lambda x: x['user_id'])
#Just show first 10 elements
print("Ordenamos:", data['activities'][:10])
# Duration
date1 = datetime.datetime.fromisoformat(data['activities'][:]['answered_at'])
date2 = datetime.datetime.fromisoformat(data['activities'][:]['first_seen_at'])
difference_date = (date1-date2)
print("Duration in seconds:", difference_date.seconds, difference_date.microseconds)
这是我的清单包含的内容,其中 140 个。在此处输入图像描述
"activities":[
{
"id":272961,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:09:53.830+00:00",
"first_seen_at":"2021-09-19T21:09:40.830+00:00"
},
{
"id":402616,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:10:27.830+00:00",
"first_seen_at":"2021-09-19T21:10:09.830+00:00"
},
{
"id":64828,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:13:19.830+00:00",
"first_seen_at":"2021-09-19T21:13:03.830+00:00"
},
{
"id":397256,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:18:06.830+00:00",
"first_seen_at":"2021-09-19T21:17:47.830+00:00"
},
{
"id":202872,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:19:00.830+00:00",
"first_seen_at":"2021-09-19T21:18:54.830+00:00"
},
{
"id":367396,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:23:30.830+00:00",
"first_seen_at":"2021-09-19T21:23:18.830+00:00"
},
{
"id":378117,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:25:12.830+00:00",
"first_seen_at":"2021-09-19T21:25:05.830+00:00"
},
{
"id":257362,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:30:30.830+00:00",
"first_seen_at":"2021-09-19T21:30:11.830+00:00"
},
{
"id":80097,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:34:23.830+00:00",
"first_seen_at":"2021-09-19T21:34:13.830+00:00"
},
解决方案
您遇到了麻烦,因为返回的数据类型data['activities'][0]
与data['activities'][:]
.
data['activities'][0]
返回列表中的第一个字典:
{
"id":272961,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:09:53.830+00:00",
"first_seen_at":"2021-09-19T21:09:40.830+00:00"
}
另一方面,列表的任何子集,包括data['activities'][:10]
or data['activities'][:]
,都会返回一个列表:
>>> data['activities'][:]
[
{
"id":272961,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:09:53.830+00:00",
"first_seen_at":"2021-09-19T21:09:40.830+00:00"
},
{
"id":402616,
"user_id":"izi57ti5",
"answered_at":"2021-09-19T21:10:27.830+00:00",
"first_seen_at":"2021-09-19T21:10:09.830+00:00"
},
...
]
您对结果的处理是尝试'answered_at'
从字典中访问该项目。在第一种情况下,这很好用:
>>> data['activities'][0]['answered_at']
"2021-09-19T21:09:53.830+00:00"
但是第二个会产生 TypeError,表明您不能使用字符串键访问列表的元素,这是真的。
相反,您必须决定如何修改工作流程以处理列表中的许多项目。例如,您可以使用循环:
for entry in data['activities']:
# entry now points to the dictionaries within the list
date1 = datetime.datetime.fromisoformat(entry['answered_at'])
date2 = datetime.datetime.fromisoformat(entry['first_seen_at'])
difference_date = (date1-date2)
# this will print out once for every element in data['activities']
print(
"Duration in seconds:",
difference_date.seconds,
difference_date.microseconds,
)
推荐阅读
- html - 如何不让文字超过按钮?
- python - 替换字符串中的非 ASCII 字符
- reactjs - 如何重用组件逻辑
- javascript - 404 错误使用 xpage 上的传单添加标记
- asp.net-mvc-5.2 - List 类型的视图模型的自定义属性绑定成员
>> - python-3.x - 将 numpy.arange() 转换为 list 后值发生了变化
- node.js - MongoDB - 在一个更新查询中使用多个获取查询的结果
- python - 如何将 1 到 6 之间的 2 个随机数加在一起 5 次
- angular - 如何在运行时从文件中加载 HTML 模板?
- javascript - Javsascript 超时从服务器加载图像