如何按列而非按行替换Python列表中的指定字符?
按列替换乐器谱线字符的解决方案
嘿,我来帮你搞定这个按列替换的问题!你现在的痛点是只能把instruments里的内容整行替换成score的字符,但实际需要按列来对应替换——也就是每一列的位置都对应score里的一个*,不管是哪一行的这个列位置。
先明确需求细节
- 我们要把
score去掉首尾|后的13个*,对应填充到instruments每一行的符号区域,每一列对应一个* instruments的每一行结构是「数字+制表符+符号串」,我们需要保留前面的数字标识,只替换后面的符号部分
实现代码(Python)
# 你的原始数据 counter = [13] instruments = ['3\t ---', '2\t / \\', '1\t / \\', '0\t--- \\ ---', '-1\t \\ /', '-2\t \\ /', '-3\t ---'] score = ['|*************|'] # 第一步:提取score的核心字符(去掉首尾的|) score_chars = score[0].strip('|') # 这里score_chars就是13个*的字符串:'*************' # 第二步:按列替换instruments的符号部分 processed_instruments = [] for line in instruments: # 拆分出前面的数字前缀(带制表符)和后面的符号串 prefix, symbols = line.split('\t', 1) # 遍历符号串的每个位置(列),用score_chars对应索引的*替换原符号 # 如果符号串长度超过score长度,补*(这里你的数据长度匹配,所以不用额外处理) new_symbols = ''.join([score_chars[i] for i, _ in enumerate(symbols)]) # 重新拼接成处理后的行 processed_line = f"{prefix}\t{new_symbols}" processed_instruments.append(processed_line) # 输出结果看看 for line in processed_instruments: print(line)
代码解释
- 提取核心字符:用
strip('|')去掉score首尾的竖线,得到我们要用来填充的13个*。 - 拆分每行结构:把
instruments的每一行拆成「数字+制表符」的前缀和后面的符号部分,这样我们可以保留原始的行标识。 - 按列替换:遍历符号串的每个索引(也就是列位置),用
score_chars对应索引的字符替换原符号——这样就实现了每一列的所有行都对应score里的同一个字符,完美解决你只能按行替换的问题。
运行这段代码后,你会得到每一行的符号部分都被替换成对应列的*,保留了原来的数字标识,完全符合按列替换的需求。
内容的提问来源于stack exchange,提问作者Nauman Shahid
相关产品推荐
相关产品推荐

