为了账号安全,请及时绑定邮箱和手机立即绑定

当我在包含字典的列表中进行枚举时,出现列表索引超出范围错误

当我在包含字典的列表中进行枚举时,出现列表索引超出范围错误

犯罪嫌疑人X 2022-05-11 14:48:13
当我遍历列表内的字典时,我得到列表索引超出范围错误。我检查了以前的问题,它没有使用枚举。我试图找到列表的长度并限制在长度内循环,但这没有用。my_list = [    {'st': '08:00', 'ed': '08:30', 'email': 'a@gmail.com'},    {'st': '08:00', 'ed': '08:30', 'email': 'c@gmail.com'},    {'st': '08:00', 'ed': '08:30', 'email': 'b@gmail.com'},    {'st': '08:30', 'ed': '09:00', 'email': 'a@gmail.com'},    {'st': '08:30', 'ed': '09:00', 'email': 'c@gmail.com'},    {'st': '08:30', 'ed': '09:00', 'email': 'b@gmail.com'},    {'st': '09:00', 'ed': '09:30', 'email': 'a@gmail.com'},    {'st': '09:00', 'ed': '09:30', 'email': 'c@gmail.com'},    {'st': '09:00', 'ed': '09:30', 'email': 'b@gmail.com'},    {'st': '09:30', 'ed': '10:00', 'email': 'a@gmail.com'},    {'st': '09:30', 'ed': '10:00', 'email': 'c@gmail.com'},    {'st': '09:30', 'ed': '10:00', 'email': 'b@gmail.com'},    {'st': '10:00', 'ed': '10:30', 'email': 'a@gmail.com'},    {'st': '10:00', 'ed': '10:30', 'email': 'c@gmail.com'},    {'st': '10:00', 'ed': '10:30', 'email': 'b@gmail.com'},    {'st': '10:30', 'ed': '11:00', 'email': 'a@gmail.com'},    {'st': '10:30', 'ed': '11:00', 'email': 'c@gmail.com'},    {'st': '10:30', 'ed': '11:00', 'email': 'b@gmail.com'},    {'st': '11:00', 'ed': '11:30', 'email': 'a@gmail.com'},    {'st': '11:00', 'ed': '11:30', 'email': 'c@gmail.com'},]len_of_my_list = len(my_list)for i,each_user in enumerate(my_list):    if my_list[i]['st']==my_list[i+1]['st'] and my_list[i]['ed']==my_list[i+1]['ed']:        if type(my_list[i]['email']) == list:            my_list[i]['email'].append(my_list[i+1]['email'])        else:            my_list[i]['email'] = [my_list[i+1]['email'], my_list[i+1]['email']]预期的结果是,必须合并电子邮件 ID
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

考虑这段代码:


for i, each_user in enumerate(my_list):

    if my_list[i]['st'] == my_list[i+1]['st'] ...

这归结为:


>>> s = "abcd"

>>> for index, letter in enumerate(s):

...     print("%d: %s, %d: %s" % (index, s[index], index + 1, s[index+1]))

...

0: a, 1: b

1: b, 2: c

2: c, 3: d

Traceback (most recent call last):

  File "<stdin>", line 2, in <module>

IndexError: string index out of range

因为我们知道enumerate(my_list)迭代整个列表,所以任何使用my_list[index+1]都将超出最后一个元素的范围。


解决这个问题,可能通过使用for i in range(len(my_list) - 1):,仍然不会产生预期的结果。我不清楚逻辑,尽管假设数据已排序并向前遍历的意图是好的。


话虽如此,使用字典,按时间间隔对对象进行分组并建立电子邮件列表非常简单,并且不区分顺序:


grouped = {}


for e in my_list:

    key = (e["st"], e["ed"])


    if key in grouped:

        grouped[key]["email"].append(e["email"])

    else:

        grouped[key] = e

        grouped[key]["email"] = [e["email"]]


result = list(grouped.values())

结果:


[

  {

    'st': '08:00', 

    'ed': '08:30', 

    'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']

  }, 

  {

    'st': '08:30', 

    'ed': '09:00', 

    'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']

  }, 

  {

    'st': '09:00', 

    'ed': '09:30', 

    'email': ['a@gmail.com', 'c@gmail.com','b@gmail.com']

  }, 

  {

    'st': '09:30', 

    'ed': '10:00', 

    'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']

  }, 

  {

    'st': '10:00', 

    'ed': '10:30', 

    'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']

  }, 

  {

    'st': '10:30', 

    'ed': '11:00', 

    'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']

  }, 

  {

    'st': '11:00', 

    'ed': '11:30', 

    'email': ['a@gmail.com', 'c@gmail.com']

  }

]


查看完整回答
反对 回复 2022-05-11
?
慕森王

TA贡献1777条经验 获得超3个赞

问题是您正在访问i+1循环中的元素。因此,一旦你到达最后一个元素,你就会得到所说的错误,因为i+1在这种情况下没有元素。根据您的用例,并且由于您不使用变量each_user,您可以替换以下行:

for i,each_user in enumerate(my_list):

for i in range(len(my_list) - 1):

这将导致除最后一个字典之外的所有字典都与列表中的下一个字典进行比较。


查看完整回答
反对 回复 2022-05-11
  • 2 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信