给定:列表列表,例如[[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)