首页 > 解决方案 > 我的 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"
      },

标签: pythonlisttypeerror

解决方案


您遇到了麻烦,因为返回的数据类型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,
    )

推荐阅读