找到列表列表中最长公共前缀的Pythonic方法是什么?

luk*_*mac 17 python

给定:列表列表,例如[[3,2,1], [3,2,1,4,5], [3,2,1,8,9], [3,2,1,5,7,8,9]]

Todo:找到所有子列表中最长的公共前缀.

存在:在另一个线程" 不在Python中使用集合的两个列表之间的公共元素 "中,建议使用"计数器",它在python 2.7之上可用.但是我们当前的项目是用python 2.6编写的,所以不使用"Counter".

我目前的代码是这样的:

l = [[3,2,1], [3,2,1,4,5], [3,2,1,8,9], [3,2,1,5,7,8,9]]
newl = l[0]
if len(l)>1:
    for li in l[1:]:
    newl = [x for x in newl if x in li]
Run Code Online (Sandbox Code Playgroud)

但我发现它不是非常pythonic,有更好的编码方式吗?

谢谢!

新编辑:很抱歉提及:在我的情况下,'l'中列表的共享元素具有相同的顺序,并始终从第0项开始.所以你不会有像这样的案例[[1,2,5,6],[2,1,7]]

小智 47

os.path.commonprefix() 适用于列表:)

>>> x = [[3,2,1], [3,2,1,4,5], [3,2,1,8,9], [3,2,1,5,7,8,9]]
>>> import os
>>> os.path.commonprefix(x)
[3, 2, 1]
Run Code Online (Sandbox Code Playgroud)


Luk*_*hne 19

我不确定它是多么pythonic

from itertools import takewhile,izip

x = [[3,2,1], [3,2,1,4,5], [3,2,1,8,9], [3,2,1,5,7,8,9]]

def allsame(x):
    return len(set(x)) == 1

r = [i[0] for i in takewhile(allsame ,izip(*x))]
Run Code Online (Sandbox Code Playgroud)