gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:28 25 4
gpt4 key购买 nike

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

我尝试找到列表的长度并将其限制在长度范围内循环,但这不起作用。

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 必须合并

my_list = 
[{'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','email': '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']}
]

最佳答案

考虑这段代码:

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']
}
]

关于python - 当我在包含字典的列表中进行枚举时,出现列表索引超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57661920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com