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}' )
ZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgoKbGlzdDEgPSBbCiAgICB7J25hbWUnOiAnc2FlZWQxLWdyMScsICdpZCc6IDF9LAogICAgeyduYW1lJzogJ3BsMS1zYWVlZDEnLCAnaWQnOiAxfSwKICAgIHsnbmFtZSc6ICdzYWVlZDExLWdyMicsICdpZCc6IDh9LAogICAgeyduYW1lJzogJ3BsMS1zYWVlZDInLCAnaWQnOiAyfSwKICAgIHsnbmFtZSc6ICdzYWVlZDMtZ3IyJywgJ2lkJzogOH0sCiAgICB7J25hbWUnOiAnc2FlZWQ1LWdyMScsICdpZCc6IDN9LAogICAgeyduYW1lJzogJ3BsMS1zYWVlZDcnLCAnaWQnOiAxfSwKICAgIHsnbmFtZSc6ICdzYWVlZDE1LWdyMScsICdpZCc6IDF9LAogICAgeyduYW1lJzogJ3BzMS1zYWVlZDE1JywgJ2lkJzogMX0sCiAgICB7J25hbWUnOiAncHMxLXNhZWVkMTEnLCAnaWQnOiAxfSwKICAgIHsnbmFtZSc6ICdzYWVlZDgtZ3IzJywgJ2lkJzogMX0sCl0KCmR1cGVzID0ge30KZm9yIG5hbWUsIGlkIGluIG1hcChpdGVtZ2V0dGVyKCduYW1lJywgJ2lkJyksIGxpc3QxKToKICAgIGR1cGVzLnNldGRlZmF1bHQoCiAgICAgICAgKG5leHQodG9rZW4gZm9yIHRva2VuIGluIG5hbWUuc3BsaXQoJy0nKSBpZiAnc2FlZWQnIG5vdCBpbiB0b2tlbiksIGlkKSwgW10KICAgICkuYXBwZW5kKG5hbWUpCmZvciAoXywgaWQpLCBuYW1lcyBpbiBkdXBlcy5pdGVtcygpOgogICAgaWYgbGVuKG5hbWVzKSA+IDE6CiAgICAgICAgcHJpbnQoZiduYW1lcyB7IiBhbmQgIi5qb2luKG5hbWVzKX0gc2FtZSBpZCB7aWR9Jyk=