Python中优雅拼接字典所有值为带\r\n的单个字符串的方法
问题描述
需要把字典里的所有值拼接成单个字符串,每个值(包括嵌套列表里的元素)后面都要加\r\n。下面的代码能实现预期效果,但想找更优雅的写法。
原代码:
d=dict(idx='1',sat='so',sox=[['x1: y3'],['x2: y1'],['x3: y3']],mul_sol='my love so') s='' for x in d: if x=='sox': for kk in d[x]: s=s +kk[0] +'\r\n' else: s=s +d[x]+'\r\n' print(s)
优雅实现方案
方案一:用辅助函数处理不同类型的值
这种写法把值的处理逻辑抽出来,不用硬编码特定键名,扩展性更好:
def parse_value(val): if isinstance(val, list): # 遍历嵌套列表,取出每个子列表的第一个元素 return (item[0] for item in val) # 普通字符串直接返回包含自身的迭代器 return (val,) d = dict(idx='1', sat='so', sox=[['x1: y3'], ['x2: y1'], ['x3: y3']], mul_sol='my love so') # 收集所有需要拼接的片段 all_parts = [] for value in d.values(): all_parts.extend(parse_value(value)) # 用join拼接比循环+=更高效,最后补一个结尾的\r\n result = '\r\n'.join(all_parts) + '\r\n' print(result)
方案二:简洁的生成器表达式写法
如果想少写几行代码,可以用嵌套生成器表达式一步到位:
d = dict(idx='1', sat='so', sox=[['x1: y3'], ['x2: y1'], ['x3: y3']], mul_sol='my love so') result = '\r\n'.join( item[0] if isinstance(val, list) else val for val in d.values() for item in (val if isinstance(val, list) else [val]) ) + '\r\n' print(result)
优势说明
- 不再硬编码
sox这类键名,后续字典新增嵌套结构的键也不用改代码 - 使用
str.join()比循环里用+=拼接字符串效率更高(字符串是不可变类型,循环拼接会产生大量中间对象) - 逻辑更清晰,可读性和可维护性比原代码好
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

