2 回答
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']
}
]
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):
这将导致除最后一个字典之外的所有字典都与列表中的下一个字典进行比较。
添加回答
举报