如何基于类型转换分组列表元素?修正Python分组代码错误
修正列表转字典的代码问题
输入列表如下:
data = [ -1, 0, 'a','b', 1, 2, 3, 'c', 6, 'd', 'e', .4, .5, 'a', 'b', 4, 'f', 'g', ]
需求说明
需要生成一个字典,键为字符串组(用/连接),值为紧跟该组后的数字集合,需满足:
- 忽略列表开头的非字符串元素
- 每组字符串数量不固定(至少1个)
- 重复的字符串组需要合并对应的数字列表
原始代码及问题
你编写的原始代码:
start = list(map(type, data)).index(str) wanted = {} for i in data[start:]: strings = [] if type(i) == str: strings.append(i) numbers = [] else: numbers.append(i) wanted['/'.join(strings)] = numbers
这段代码的输出结果:
{'a': [], 'b': [4], '': [4], 'c': [6], 'd': [], 'e': [0.4, 0.5], 'f': [], 'g': []}
你的期望输出:
{'a/b': [1, 2, 3, 4], 'c': [6], 'd/e': [0.4, 0.5], 'f/g': []}
修正后的代码
data = [ -1, 0, 'a','b', 1, 2, 3, 'c', 6, 'd', 'e', .4, .5, 'a', 'b', 4, 'f', 'g', ] # 找到第一个字符串的起始位置,兼容无字符串的情况 try: start_idx = next(i for i, val in enumerate(data) if isinstance(val, str)) except StopIteration: start_idx = len(data) wanted = {} current_strings = [] current_numbers = [] for item in data[start_idx:]: if isinstance(item, str): # 若已有未处理的字符串组,先存入字典 if current_strings: key = '/'.join(current_strings) if key in wanted: wanted[key].extend(current_numbers) else: wanted[key] = current_numbers.copy() # 重置分组状态 current_strings = [item] current_numbers = [] else: current_strings.append(item) else: # 收集当前组的数字 current_numbers.append(item) # 处理最后一组未存入的字符串和数字 if current_strings: key = '/'.join(current_strings) if key in wanted: wanted[key].extend(current_numbers) else: wanted[key] = current_numbers.copy() print(wanted)
代码说明
- 起始位置定位:用生成器+
next()找到第一个字符串的位置,比原方法更健壮——如果列表中没有字符串,不会抛出异常。 - 分组收集逻辑:
- 先收集连续的字符串作为一组,直到碰到数字;
- 碰到数字就持续收集,直到下一个字符串出现;
- 遇到新字符串时,先把上一组的字符串(用
/拼接)和对应数字存入字典:如果键已存在,就将新数字追加到原有列表;不存在则直接创建键值对,之后重置分组状态。
- 收尾处理:遍历结束后,必须处理最后一组未存入字典的字符串和数字,避免遗漏。
运行后输出与期望一致:
{'a/b': [1, 2, 3, 4], 'c': [6], 'd/e': [0.4, 0.5], 'f/g': []}
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

