当前位置: 首页 > 面试题库 >

查找列表的最长公共前缀的Python方法是什么?

羊舌富
2023-03-14
问题内容

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

待办事项 :查找所有子列表中最长的公共前缀。

存在
:在另一个线程“两个列表之间的公共元素未使用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]

但是我发现它不是很pythonic,有没有更好的编码方式?

谢谢!

新编辑 :抱歉,我的情况是,“
l”中列表的共享元素具有相同的顺序,并且始终从第0个项目开始。所以你不会有类似的情况[[1,2,5,6],[2,1,7]]


问题答案:

我不确定它是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))]


 类似资料:
  • 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 所有输入只包含小写字母 a-z 。 话不多说,上code: /** * @param {stri

  • 问题内容: 是否有一个regexp可以找到两个字符串的最长公共前缀?而且如果一个正则表达式无法解决这个问题,那么使用正则表达式(perl,ruby,python等)中最精美的代码或oneliner就是什么。 PS:我可以通过编程轻松地做到这一点,我只是想好奇,因为在我看来这可以通过正则表达式解决。 PPS:使用正则表达式的O(n)解决方案可获得额外奖励。来吧,它应该存在! 问题答案: 如果有些字符

  • 问题内容: python中是否有内置函数返回两个列表的最长公共子序列的长度? 我试图找到最长的公共子序列,然后得到它的长度,但是我认为必须有一个更好的解决方案。 问题答案: 您可以轻松地将LCS重新装配为LLCS: 演示: 如果您想要最长的公共 子字符串 (一个 不同 但相关的问题, 子 序列是连续的),请使用: 这与动态编程方法非常相似,但是我们跟踪到目前为止找到的最大长度(因为不再保证表中的最

  • 正如维基所说: 一组字符串的最长公共子字符串可以通过为字符串构建一个通用后缀树来找到,然后从其下方子树中的所有字符串中找到具有叶节点的最深内部节点 正如贾斯汀所说: 在(紧凑的)后缀树中,您需要找到最深的内部节点,这些节点包含所有字符串中的叶节点。如果在同一深度有多个节点,则必须比较该节点表示的字符串长度。i、 e.ABC、BC和C都有相同的深度,因此您必须比较ABC、BC和C字符串的长度,看看哪

  • 问题内容: 我有一个像这样的数组: 我想找到字符串的最长公共前缀。在这种情况下, 我以为我会遵循这个程序 问题 是否有内置函数或更简单的方法? 对于我的5行数组来说可能还不错,但是如果我要做几千行数组,那么将会有很多开销,所以我必须使用起始值进行移动计算,例如=字符串的一半,如果它失败,然后直到它起作用,然后再递增1直到我们成功。这样我们就可以进行最少的比较以获得结果。 是否已经有解决此类问题的公

  • 一组字符串的最长公共子字符串可以通过为字符串构建一个通用后缀树来找到,然后从其下方子树中的所有字符串中找到具有叶节点的最深内部节点 最长的公共子字符串是,但它不是。我看不出wiki的描述在这里有什么帮助。 不是最深的内部节点和叶节点。 有什么帮助来理解它是如何工作的吗?