Вы можете сгруппировать списки с общими вторыми элементами следующим образом:
s = sorted(entities, key = lambda x: x[1])
[list(v) for k,v in groupby(s, key=lambda x: x[1])]
[[('date', '12-10-2018')],
[('loc', 'blr'), ('cap', 'blr')],
[('tmp', 'warm')],
[('aps', 'yes')]]
Если производительность является проблемой, рассмотрите возможность использования operator.itemgetter
:
from operator import itemgetter
s = sorted(entities, key = itemgetter(1))
[list(v) for k,v in groupby(s, key = itemgetter(1))]
[[('date', '12-10-2018')],
[('loc', 'blr'), ('cap', 'blr')],
[('tmp', 'warm')],
[('aps', 'yes')]]
Теперь, если вы хотите использовать только те случаи, когда два кортежа имели общий второй элемент, вы можете сделать:
[i for i in l if len(i)>1]
[[('loc', 'blr'), ('cap', 'blr')]]
Я предложил этот ответ, чтобы таким образом вы могли расширить его до n
commonэлементы на втором месте, так как их может быть больше 2.