элементы контрольного списка включают в себя другие элементы - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть список:

Lt = [((5,14),(8,14),(10,4)),((5,14),(8,14),(9,14)),((5,14),(8,14)),((5,14),(6,4),(8,14)),
       ((8,14),(9,14)),((8,14),(10,4))]

И я хочу получить:

Lt = [((5,14),(8,14),(10,4)),((5,14),(8,14),(9,14)),((5,14),(6,4),(8,14))]

Это означает, что если Lt [i] включает Lt [j], Lt [j]будет удален.

А это мой уродливый код:

def filter_clique(old_center):
# [(('X', 2), ('f', 6)), (('X', 2), ('O', 3)), (('X', 2), ('O', 3),('f', 6))]
# return: [(('X', 2), ('O', 3),('f', 6))]
# first: sorted list
old_center = sorted(old_center, key=lambda m: len(m), reverse=True)
rm_index = []
lth = len(old_center)
for i in range(lth-1):
    for j in range(i+1, lth):
        if set(old_center[j]).issubset(set(old_center[i])):
            rm_index.append(j)
if len(rm_index):
    old_center = np.delete(old_center, rm_index).tolist()
    return old_center
else:
    return old_center

Если мой список более длинный, этот процесс становится очень дорогим.

Какой способ самый быстрыйсделать это?Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Это один подход.

Демонстрация:

Lt = [(5,14,8,14,10,4),(5,14,8,14,9,14),(5,14,8,14),(5,14,6,4,8,14),(8,14,9,14),(8,14,10,4)]
Lt = sorted(set(Lt), key=lambda m: len(m), reverse=True)
res = []
while Lt:
    val = Lt.pop()
    if not any(set(val).issubset(set(i)) for i in Lt):
        res.append(val)
print(res)

Вывод:

[(5, 14, 8, 14, 10, 4), (5, 14, 8, 14, 9, 14), (5, 14, 6, 4, 8, 14)]
0 голосов
/ 19 сентября 2018

Вот новая попытка:

sets = list(map(set, Lt))
new_list = [l for l,s in zip(Lt, sets) if not any(s < other for other in sets)]
print(new_list)

# [(5, 14, 8, 14, 10, 4), (5, 14, 6, 4, 8, 14), (5, 14, 8, 14, 9, 14)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...