猿问

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

当我遍历列表内的字典时,我得到列表索引超出范围错误。我检查了以前的问题,它没有使用枚举。


我试图找到列表的长度并限制在长度内循环,但这没有用。


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



犯罪嫌疑人X
浏览 144回答 2
2回答

BIG阳

考虑这段代码:for i, each_user in enumerate(my_list):&nbsp; &nbsp; if my_list[i]['st'] == my_list[i+1]['st'] ...这归结为:>>> s = "abcd">>> for index, letter in enumerate(s):...&nbsp; &nbsp; &nbsp;print("%d: %s, %d: %s" % (index, s[index], index + 1, s[index+1]))...0: a, 1: b1: b, 2: c2: c, 3: dTraceback (most recent call last):&nbsp; 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:&nbsp; &nbsp; key = (e["st"], e["ed"])&nbsp; &nbsp; if key in grouped:&nbsp; &nbsp; &nbsp; &nbsp; grouped[key]["email"].append(e["email"])&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; grouped[key] = e&nbsp; &nbsp; &nbsp; &nbsp; grouped[key]["email"] = [e["email"]]result = list(grouped.values())结果:[&nbsp; {&nbsp; &nbsp; 'st': '08:00',&nbsp;&nbsp; &nbsp; 'ed': '08:30',&nbsp;&nbsp; &nbsp; 'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']&nbsp; },&nbsp;&nbsp; {&nbsp; &nbsp; 'st': '08:30',&nbsp;&nbsp; &nbsp; 'ed': '09:00',&nbsp;&nbsp; &nbsp; 'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']&nbsp; },&nbsp;&nbsp; {&nbsp; &nbsp; 'st': '09:00',&nbsp;&nbsp; &nbsp; 'ed': '09:30',&nbsp;&nbsp; &nbsp; 'email': ['a@gmail.com', 'c@gmail.com','b@gmail.com']&nbsp; },&nbsp;&nbsp; {&nbsp; &nbsp; 'st': '09:30',&nbsp;&nbsp; &nbsp; 'ed': '10:00',&nbsp;&nbsp; &nbsp; 'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']&nbsp; },&nbsp;&nbsp; {&nbsp; &nbsp; 'st': '10:00',&nbsp;&nbsp; &nbsp; 'ed': '10:30',&nbsp;&nbsp; &nbsp; 'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']&nbsp; },&nbsp;&nbsp; {&nbsp; &nbsp; 'st': '10:30',&nbsp;&nbsp; &nbsp; 'ed': '11:00',&nbsp;&nbsp; &nbsp; 'email': ['a@gmail.com', 'c@gmail.com', 'b@gmail.com']&nbsp; },&nbsp;&nbsp; {&nbsp; &nbsp; 'st': '11:00',&nbsp;&nbsp; &nbsp; 'ed': '11:30',&nbsp;&nbsp; &nbsp; 'email': ['a@gmail.com', 'c@gmail.com']&nbsp; }]

慕森王

问题是您正在访问i+1循环中的元素。因此,一旦你到达最后一个元素,你就会得到所说的错误,因为i+1在这种情况下没有元素。根据您的用例,并且由于您不使用变量each_user,您可以替换以下行:for&nbsp;i,each_user&nbsp;in&nbsp;enumerate(my_list):和for&nbsp;i&nbsp;in&nbsp;range(len(my_list)&nbsp;-&nbsp;1):这将导致除最后一个字典之外的所有字典都与列表中的下一个字典进行比较。
随时随地看视频慕课网APP

相关分类

Python
我要回答