我目前有一个字典列表,其外观如下:
total_list = [
{'email': 'usera@email.com', 'id': 1, 'country': 'UK'},
{'email': 'usera@email.com', 'id': 1, 'country': 'Germany'},
{'email': 'userb@email.com', 'id': 2, 'country': 'UK'}
{'email': 'userc@email.com', 'id': 3, 'country': 'Italy'},
{'email': 'userc@email.com', 'id': 3, 'country': 'Netherland'},
{'email': 'userd@email.com', 'id': 4, 'country': 'France'},
...
]
我想根据大小来进行分割,比如说新的大小列表是每个列表3个项目,但我也想确保所有相同用户在同一个新子列表中。
所以我试图创建的结果是:
list_a = [
{'email': 'usera@email.com', 'id': 1, 'country': 'UK'},
{'email': 'userb@email.com', 'id': 2, 'country': 'UK'}
{'email': 'usera@email.com', 'id': 1, 'country': 'Germany'}
]
list_b = [
{'email': 'userc@email.com', 'id': 3, 'country': 'Italy'},
{'email': 'userd@email.com', 'id': 4, 'country': 'France'}
{'email': 'userc@email.com', 'id': 3, 'country': 'Netherland'},
...
]
显然在我提供的示例中,用户在列表中非常靠近,但实际上它们可能分散更多。 我考虑根据电子邮件对列表进行排序,然后进行拆分,但是如果应该分组在一起的项目恰好位于主列表将被分割的确切位置,我不确定会发生什么。
到目前为止我尝试过:
def list_splitter(main_list, size):
for i in range(0, len(main_list), size):
yield main_list[i:i + size]
# calculating the needed number of sublists
max_per_batch = 3
number_of_sublists = ceil(len(total_list) / max_per_batch)
# sort the data by email
total_list.sort(key=lambda x: x['email'])
sublists = list(list_splitter(main_list=total_list, size=max_per_batch))
问题在于使用这种逻辑,我无法 100% 确保具有相同电子邮件值的任何项目最终都会出现在同一个子列表中。由于排序的原因,这种情况可能发生,但并不确定。
基本上,我需要一种方法来确保具有相同电子邮件的项目始终位于同一子列表中,但拆分的主要条件是子列表大小。