如何用Python列表推导式提取两个列表元素的指定位置词汇
问题说明
使用Python列表推导式实现如下需求时出现结果不符合预期的问题:
- 提取列表
meeps每个元素的第一个单词 - 提取列表
peeps每个元素的第二个单词 - 两个列表的提取结果按对应位置配对输出
初始错误实现代码如下:
meeps = ["Foghorn Leghorn", "Elmer Fudd", "Road Runner", "Bugs Bunny", "Daffy Duck", "Tasmanian Devil"] peeps = ["John Cleese", "Michael Palin", "Terry Gilliam", "Terry Jones", "Graham Chapman","Eric Idle"] mashemup1 = [(x.split()[0], y.split()[1]) for x in meeps for y in peeps] print(mashemup1)
运行后得到的是两个列表所有元素两两配对的笛卡尔积结果,共36组配对,和预期的6组同位置配对结果不符。
错误原因
列表推导式中写双层for循环的逻辑等价于两层嵌套遍历:外层遍历meeps的每一个元素,内层会遍历完peeps的所有元素做配对,自然会生成全量笛卡尔积,无法实现同位置一一配对的效果。
正确实现
使用内置函数zip()对两个列表做并行遍历,每次迭代直接拿到两个列表同位置的元素对,再做单词提取即可,修正后的代码:
meeps = ["Foghorn Leghorn", "Elmer Fudd", "Road Runner", "Bugs Bunny", "Daffy Duck", "Tasmanian Devil"] peeps = ["John Cleese", "Michael Palin", "Terry Gilliam", "Terry Jones", "Graham Chapman","Eric Idle"] mashemup1 = [(x.split()[0], y.split()[1]) for x, y in zip(meeps, peeps)] print(mashemup1)
运行输出为预期的同位置配对结果:
[('Foghorn', 'Cleese'), ('Elmer', 'Palin'), ('Road', 'Gilliam'), ('Bugs', 'Jones'), ('Daffy', 'Chapman'), ('Tasmanian', 'Idle')]
补充说明:如果两个列表长度不一致,
zip()会默认以更短的列表长度为基准截断配对;如果需要保留长列表的所有元素,可以使用itertools.zip_longest做补位配对,当前场景两个列表长度一致,直接使用zip()即可满足需求。
内容的提问来源于stack exchange,提问作者sss
相关产品推荐
相关产品推荐

