如何使用字典推导式实现按数字位数分组列表元素的需求?
可以用字典推导式实现这个分组需求!
当然没问题,不过得先理清:标准的字典推导式是一对一映射,而你的需求是把多个元素按位数分组(一对多),所以直接用简单的推导式没法完成累积,但我们可以结合集合推导式来获取所有唯一的位数键,再为每个键收集对应元素,这样就能用字典推导式实现了。
字典推导式实现代码
先看最终的实现:
a_list = [22, 55, 77, 234, 765, 1234] a_dict = { key: [num for num in a_list if len(str(num)) == key] for key in {len(str(num)) for num in a_list} } print(a_dict) # 输出: {2: [22, 55, 77], 3: [234, 765], 4: [1234]}
代码解释
- 外层的
{len(str(num)) for num in a_list}是集合推导式,用来获取a_list中所有元素的唯一数字位数(这里得到{2,3,4}),作为字典的键。 - 对于每个键
key,内层的列表推导式[num for num in a_list if len(str(num)) == key]会收集所有位数等于key的元素,作为对应键的值。
对比你的现有代码
你的代码是典型的循环累加方式,逻辑是对的,但可以简化:
a_dict = {} for i in a_list: key = len(str(i)) # 用setdefault方法简化临时列表的操作 a_dict.setdefault(key, []).append(i)
这种方式的时间复杂度是O(n)(只遍历一次列表),而上面的字典推导式是O(n*k)(k是不同位数的数量),对于小列表来说两者差异不大,但数据量大时循环累加更高效。
额外推荐:更高效的分组方式
如果追求最高效的分组,推荐用collections.defaultdict,代码更简洁:
from collections import defaultdict a_dict = defaultdict(list) for num in a_list: key = len(str(num)) a_dict[key].append(num) # 若需要转换成普通字典,执行 dict(a_dict) 即可
内容的提问来源于stack exchange,提问作者Dheeraj Somanadh
相关产品推荐
相关产品推荐

