Библиотека вроде os.path.commonprefix, но возвращает общий префикс любых 2+ введенных списков? - PullRequest
0 голосов
/ 24 января 2019
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) не возвращает никакого существующего общего префикса(как в моем примере), но введен общий префикс всех заданных списков.Есть ли библиотека, которая делает то, что я хочу в моем примере?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Внесены изменения в опубликованный ответ здесь

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']
0 голосов
/ 24 января 2019

Вы можете использовать свой первоначальный подход, добавив itertools в микс, чтобы найти commonprefix всех комбинаций списков, а затем используйте max(), чтобы вернуть самую длинную комбинацию.Обратите внимание, что этот подход будет возвращать только один commonprefix, поэтому, если есть несколько результатов, которые имеют одинаковую длину и длиннее всех остальных, он вернет только один из них.

Например:

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']
...