gpt4 book ai didi

Python:将名称列表划分为大小相等的子列表

转载 作者:太空狗 更新时间:2023-10-29 21:51:03 25 4
gpt4 key购买 nike

我有一个名字列表,例如['Agrajag', 'Colin', 'Deep Thought', ..., 'Zaphod Beeblebrox', 'Zarquon']。现在我想将此列表划分为大致相等大小的子列表,以便子组的边界位于名称的第一个字母处,例如 A-F、G-L、M-P、Q-Z,而不是 A-Fe、Fi-Mo、Mu-Pra , Z 前。

我只能想出一个不考虑子组大小的静态大小分区:

import string, itertools

def _group_by_alphabet_key(elem):
char = elem[0].upper()
i = string.ascii_uppercase.index(char)
if i > 19:
to_c = string.ascii_uppercase[-1];
from_c = string.ascii_uppercase[20]
else:
from_c = string.ascii_uppercase[i/5*5]
to_c = string.ascii_uppercase[i/5*5 + 4]
return "%s - %s" % (from_c, to_c)

subgroups = itertools.groupby(name_list, _group_by_alphabet_key)

有什么更好的主意吗?

P.S.:这听起来有点像家庭作业,但它实际上适用于一个网页,其中成员应显示在 5-10 个标签中,每个标签的大小相同。

最佳答案

这里有一些可能有用的东西。我确信有一种更简单的方法……可能涉及 itertools。请注意,num_pages 仅粗略地确定您实际获得的页面数。

编辑:糟糕!有一个错误——它切断了最后一组!下面应该是固定的,但请注意,最后一页的长度将稍微不可预测。此外,我添加了 .upper() 来考虑可能的小写名称。

EDIT2:以前定义 letter_groups 的方法效率低下;以下基于字典的代码更具可扩展性:

names = ['Agrajag', 'Colin', 'Deep Thought', 'Ford Prefect' , 'Zaphod Beeblebrox', 'Zarquon']
num_pages = 3

def group_names(names, num_pages):
letter_groups = defaultdict(list)
for name in names: letter_groups[name[0].upper()].append(name)
letter_groups = [letter_groups[key] for key in sorted(letter_groups.keys())]
current_group = []
page_groups = []
group_size = len(names) / num_pages
for group in letter_groups:
current_group.extend(group)
if len(current_group) > group_size:
page_groups.append(current_group)
current_group = []
if current_group: page_groups.append(current_group)

return page_groups

print group_names(names, num_pages)

关于Python:将名称列表划分为大小相等的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938224/

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