如何以最Pythonic的方式将4词字符串组转为词对列表?
问题描述
我有如下字符串列表:
['word1 word2 word3 word4', 'word5 word6 word7 word8']
(示例仅展示两个字符串,实际可能有更多)。我希望生成如下格式的新列表:
['word1 word2', 'word3 word4', 'word5 word6', 'word7 word8']
我尝试了以下代码:
lines = ['word1 word2 word3 word4', 'word5 word6 word7 word8'] [[word1 + ' ' + word2, word3 + ' ' + word4] for line in lines for word1, word2, word3, word4 in line.split()]
但出现了如下错误:
ValueError: too many values to unpack (expected 4)
请问如何以最Pythonic的方式实现该需求?
解决方法
错误原因
你的代码报错是因为line.split()返回的是包含4个单词的列表,而你写的for word1, word2, word3, word4 in line.split()是在遍历列表里的每个单个单词,试图把单个单词拆成4个变量,这显然行不通。正确的做法是先对拆分后的单词列表进行分组,再拼接成目标字符串。
方法1:列表推导式+两两分组(最Pythonic)
利用zip和迭代器的特性,实现简洁的两两分组拼接:
lines = ['word1 word2 word3 word4', 'word5 word6 word7 word8'] result = [ ' '.join(pair) for line in lines for pair in zip(*[iter(line.split())]*2) ]
解释:[iter(line.split())]*2会创建两个指向同一个迭代器的引用,zip每次从迭代器里取两个元素,这样就把单词列表按顺序两两分组,比如['word1','word2','word3','word4']会被分成('word1','word2')和('word3','word4'),最后用' '.join()拼接成目标字符串。
方法2:切片分组(直观易懂)
如果确定每个字符串拆分后都是偶数个单词,用切片分组的方式更直观,适合新手理解:
lines = ['word1 word2 word3 word4', 'word5 word6 word7 word8'] result = [] for line in lines: words = line.split() # 步长为2,每次取两个单词 for i in range(0, len(words), 2): result.append(' '.join(words[i:i+2]))
方法3:生成器表达式(内存友好)
如果处理的字符串数量极多,用生成器表达式可以避免一次性加载所有结果到内存,节省资源:
lines = ['word1 word2 word3 word4', 'word5 word6 word7 word8'] result_generator = ( ' '.join(pair) for line in lines for pair in zip(*[iter(line.split())]*2) ) # 需要转成列表时执行:list(result_generator)
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

