Эффективное сопоставление подсписков в Python - PullRequest
2 голосов
/ 10 ноября 2011

Учитывая двумерный список, я хотел бы найти все, что содержит подсписок.Я понимаю, что могу сделать что-то вроде:

#Psuedo-Python (not kosher)
def MatchAll(theList,toMatch):
    result=list(theList)
    for nMatch in toMatch:
        for nResult in result:
            if not nMatch in nResult:
                result.remove(nResult)
    return result

Но, похоже, в этом есть много всего плохого.Кажется, это очень непохоже на код Python, который я видел и имел дело до сих пор, кроме того, что я вносил изменения в список во время итерации, который я прочитал, совсем нехорошо.Кроме того, это кажется ужасно неэффективным: хотя для моих целей длина toMatch не должна превышать трех, длина списка неизвестна и может быть довольно большой.Любая помощь очень ценится, и заранее спасибо.

1 Ответ

3 голосов
/ 10 ноября 2011

То, что я бы сделал, - это оставлю только подсписки, которые соответствуют всем элементам в списке «совпадений».

def match_all(the_list, to_match):
    return [sublist for sublist in the_list 
                if all(item in sublist for item in to_match)]

Вы можете ускорить это, используя set:

def match_all(the_list, to_match):
    matches = set(to_match).issubset
    return [sublist for sublist in the_list if matches(sublist)]
...