Необходимо удалить дубликаты кортежей в зависимости от длины кортежа в списке - PullRequest
0 голосов
/ 17 ноября 2018

Привет, у меня есть список, как показано ниже: для образца:

l = [('b','a','c'),('a','c','d','f'),('a','y','f'),('b','a'),('a','c'), ('b','g')]

Теперь мне нужно удалить только ('b', 'a') кортеж, но не нужно удалять ('b', 'a', 'c'), аналогично ('a', 'c') нужно удалить, поэтому в основном Мне нужно удалить кортеж, если длина == 2, и это должен быть дубликат кортежа.

Мне нужен вывод как:

[('b','a','c'),('a','c','d','f'),('a','y','f'), ('b','g')]

Здесь ('b','g') не должно быть удалено, потому что оно не соответствует ни одному другому кортежу.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Предполагая, что вы только один самый длинный кортеж и отбрасываете более короткие с элементами, которые являются подмножествами элементов в списке:

l = [('b','a','c'),('a','c','d','f'),('a','y','f'),('b','a'),('a','c'), ('b','g')]
l = sorted(l, key = lambda x: len(x))

for idx,tup in enumerate(l):
    if any(all(i in t for i in tup) for t in l[idx+1:]):
        pass #do nothing
    else:
        print(tup) #print unique longest tuple

sort строк, так что вы всегда будете сравнивать более короткие строкиво-первых, используя перечисление и настройку смещения, вы всегда сравниваете с более длинными кортежами впереди.all сравнивает каждое подмножество кортежа с теми, которые находятся впереди, и any возвращает True, если все подмножества находятся в более длинном кортеже, независимо от длины.

0 голосов
/ 17 ноября 2018

Вы можете использовать словарь, снабженный ключами первыми 2 элементами кортежа, чтобы отслеживать, сколько «дубликатов» существует для данного кортежа. Тогда вы можете игнорировать 2 набора элементов, которые не являются уникальными в конечном результате:

l = [('32822', '32891'), ('32822', '32891', 'HRSNNJAQ-vMME-02', '10.88.163.113'), ('32891', '32781'), ('32781', '32822'), ('32781', '32822', 'EKRGMD92-vMME-01', '10.88.158.81', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32781', '33033', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32781', '33033'), ('32891', '33033'), ('32822', '33033')]

groups = {}
for t in l:
    k = t[:2]
    groups.setdefault(k, []).append(t)

result = [t for t in l if len(t) > 2 or len(groups[t]) == 1]

print(result)
# [('32822', '32891', 'HRSNNJAQ-vMME-02', '10.88.163.113'), ('32891', '32781'), ('32781', '32822', 'EKRGMD92-vMME-01', '10.88.158.81', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32781', '33033', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32891', '33033'), ('32822', '33033')]
...