from operator import itemgetter

list1 = [
    {'name': 'saeed1-gr1', 'id': 1},
    {'name': 'pl1-saeed1', 'id': 1},
    {'name': 'saeed11-gr2', 'id': 8},
    {'name': 'pl1-saeed2', 'id': 2},
    {'name': 'saeed3-gr2', 'id': 8},
    {'name': 'saeed5-gr1', 'id': 3},
    {'name': 'pl1-saeed7', 'id': 1},
    {'name': 'saeed15-gr1', 'id': 1},
    {'name': 'ps1-saeed15', 'id': 1},
    {'name': 'ps1-saeed11', 'id': 1},
    {'name': 'saeed8-gr3', 'id': 1},
]

dupes = {}
for name, id in map(itemgetter('name', 'id'), list1):
    dupes.setdefault(
        (next(token for token in name.split('-') if 'saeed' not in token), id), []
    ).append(name)
for (_, id), names in dupes.items():
    if len(names) > 1:
        print(f'names {" and ".join(names)} same id {id}')