像 os.path.commonprefix 但 returns 任何 2+ 输入列表的公共前缀的库?
Library like os.path.commonprefix but returns common prefix of any 2+ inputted lists?
dict = {'a':['b1','b2', 'b3'], 'b':['b1','b2','b3'], 'c':['b1','b3','b4','b5']}
toList = list(dict.values())
os.path.commonprefix(toList)
os.path.commonprefix(toList) 仅打印 ['b1'] 但我试图在输入的任何列表列表中找到最长的公共前缀,因此 ['b1', 'b2'] 这里。另一个例子:
[a,b,c],[a,c,c],[a,b] -> [a,b]
[a,c,d],[a,b,c],[a,d] -> [a]
*已编辑的原始问题 - 意识到 os.path.commonprefix(toList) 没有 return 任何现有的公共前缀(如我的示例),而是输入的所有给定列表的公共前缀。在我的示例中是否有一个库可以满足我的需求?
您可以通过将 itertools
添加到组合中以找到所有列表组合的 commonprefix
然后使用 max()
到最长的 return 来构建您的初始方法一。请注意,这种方法只会 return 一个 commonprefix
因此,如果有多个长度相等且比其他所有结果都长的结果,它只会 return 其中一个。
例如:
import itertools
import os
data = [['a','b','c'],['a','c','c'],['a','b']]
prefixes = [os.path.commonprefix([a, b]) for a, b in itertools.combinations(data, 2)]
longest = max(prefixes, key=len)
print(longest)
# OUTPUT
# ['a', 'b']
对发布的答案进行了更改 here
from itertools import takewhile,izip
x = [['b1', 'b2', 'b3'], ['b1', 'b3', 'b4', 'b5'], ['b1', 'b2', 'b3']]
flag_to_stop=False # flag to stop returning True
def allsame(x):
global flag_to_stop
if flag_to_stop:
return False
elif len(set(x)) == 1:
return True
elif len(set(x))>=1 and len(set(x))<len(x):
flag_to_stop=True #we have found the maximum common prefix. set flag_to_stop to True
return True
elif len(set(x))==len(x):
flag_to_stop=True
return False
[i[0] for i in takewhile(allsame ,izip(*x))]
输出
['b1', 'b2']
dict = {'a':['b1','b2', 'b3'], 'b':['b1','b2','b3'], 'c':['b1','b3','b4','b5']}
toList = list(dict.values())
os.path.commonprefix(toList)
os.path.commonprefix(toList) 仅打印 ['b1'] 但我试图在输入的任何列表列表中找到最长的公共前缀,因此 ['b1', 'b2'] 这里。另一个例子:
[a,b,c],[a,c,c],[a,b] -> [a,b]
[a,c,d],[a,b,c],[a,d] -> [a]
*已编辑的原始问题 - 意识到 os.path.commonprefix(toList) 没有 return 任何现有的公共前缀(如我的示例),而是输入的所有给定列表的公共前缀。在我的示例中是否有一个库可以满足我的需求?
您可以通过将 itertools
添加到组合中以找到所有列表组合的 commonprefix
然后使用 max()
到最长的 return 来构建您的初始方法一。请注意,这种方法只会 return 一个 commonprefix
因此,如果有多个长度相等且比其他所有结果都长的结果,它只会 return 其中一个。
例如:
import itertools
import os
data = [['a','b','c'],['a','c','c'],['a','b']]
prefixes = [os.path.commonprefix([a, b]) for a, b in itertools.combinations(data, 2)]
longest = max(prefixes, key=len)
print(longest)
# OUTPUT
# ['a', 'b']
对发布的答案进行了更改 here
from itertools import takewhile,izip
x = [['b1', 'b2', 'b3'], ['b1', 'b3', 'b4', 'b5'], ['b1', 'b2', 'b3']]
flag_to_stop=False # flag to stop returning True
def allsame(x):
global flag_to_stop
if flag_to_stop:
return False
elif len(set(x)) == 1:
return True
elif len(set(x))>=1 and len(set(x))<len(x):
flag_to_stop=True #we have found the maximum common prefix. set flag_to_stop to True
return True
elif len(set(x))==len(x):
flag_to_stop=True
return False
[i[0] for i in takewhile(allsame ,izip(*x))]
输出
['b1', 'b2']