Soy nueva en Python y me pregunto cómo resolver esto ...

Tengo un diccionario llamado tagsDic que tiene un motivo de cancelación como clave y una identificación de etiqueta como valor.

Estoy consultando contactos de mi CRM y almacenándolos en una lista (todos los miembros cancelados). Si un valor de tagsDic está en el registro, quiero agregar la clave correspondiente a cada registro en la lista.

El valor estaría en el campo Contact.Groups y la consulta devuelve una cadena de cada ID de etiqueta que tiene el contacto como '123,233,455,1123,5569,10123'.

Entonces, si ', 10738' está en Contact.Groups, me gustaría agregar 'Desconocido' a ese registro.

¿Hay alguna manera de hacer esto usando la comprensión de la lista en la última fila de mi código?

Este es un ejemplo de un registro en todos los miembros cancelados:

{'Contact.OwnerID': 28950, 'Contact.Groups': '128,138,206,208,312,420,493,790,952,1528,1554,3286,3302,3634,4090,6566,6570,6572,6576,6578,6582,6584,6588,6596,6600,6604,6606,6608,6610,6614,6766,6782,6784,6934,6966,6970,6972,6992,7054,7060,7062,7226,7366,7688,7692,7906,8006,8010,8122,8130,8254,8274,8282,8290,8418,8644,8672,8734,8873,9041,9043,9171,9175,9540,9622,9752,10738', 'DateCreated': <DateTime '20190513T17:28:05' at 0x10dbec5c0>, 'Contact.Id': 621894}

Y esto es lo que me gustaría haber devuelto con la última línea con lc_allcancelmembers:

[18526, datetime.datetime(2019, 4, 16, 10, 49, 22), 327378, '130,132,134,136,138,140,154,206,208,290,312,493,762,788,882,952,968,1002,1088,1226,1234,2610,2972,2974,3102,6034,6950,8222,8282,8292,8412,8418,8610,8672,8931,9121,9542,9734,9740,9754,10738', 'Unknown']

'Desconocido' se agrega al final del registro en lc_allcancelmembers porque ', 10738' estaba en el campo Contact.Groups en todos los miembros cancelados.

¡Gracias!

Aquí está el código con el que estoy trabajando: '' '

limit = 1000
searchPage = 0
tagId = 493
table = 'ContactGroupAssign'
selectedFields = ['Contact.Id', 'DateCreated', 'Contact.OwnerID', 'Contact.Groups']
queryDataUnknown = {'GroupId': tagId, 'DateCreated': "~>=~" + str(twoyearsago)}

tagsDic = {'Unknown': ',10738', 
'Cant Afford': ',10712', 
'Doesnt Want To Pay': ',10714', 
'No 3rd Party': ',10716', 
'No Longer Qualifies': ',10718', 
'Scam': ',10720', 
'No Contact': ',10734', 
'Collections - Non Payment': ',7878', 
'Billing Cancellation': ',10748', 
'NBDK': ',8744', 
'Within 5 Days: Cant Afford CTF': ',10744', 
'Within 5 Days: Changed Mind/Persuaded': ',10746'}

allcancelledmembers = []
while True:
        queryResults = infusionsoft.DataService('query', table, limit, searchPage, queryDataUnknown, selectedFields)
        allcancelledmembers += queryResults
        searchPage += 1
        if len(queryResults) < 1000:
            break
lc_allcancelmembers =[[record.get("Contact.Id"),convert_is_datetime(str(record.get("DateCreated")))record.get("Contact.OwnerID"),record.get("Contact.Groups")] for record in allcancelledmembers]

'''

0
Preston G 15 jun. 2020 a las 23:02

3 respuestas

La mejor respuesta

Agregue esto en 'Unknown' if '10738' in record.get('Contact.Groups') else '' su código de comprensión de la lista.

Agregará 'Desconocido' a la lista si '10738' en 'Contacto.Grupos', de lo contrario, agregará una cadena vacía.

lc_allcancelmembers = [[record.get("Contact.Id"), convert_is_datetime(str(record.get("DateCreated"))), record.get("Contact.OwnerID"), record.get("Contact.Groups"), [k for k, v in tagsDic.items() if v in record.get("Contact.Groups")][0]] for record in allcancelledmembers]
0
komatiraju032 16 jun. 2020 a las 13:06

Asumiendo que su código es correcto, esta es la forma de implementarlo en una lista de comprensión:

De:

allcancelledmembers = []
while True:
        queryResults = infusionsoft.DataService('query', table, limit, searchPage, queryDataUnknown, selectedFields)
        allcancelledmembers += queryResults
        searchPage += 1
        if len(queryResults) < 1000:
            break

Para:

allcancelledmembers = [p for s in [infusionsoft.DataService('query', table, limit, searchPage, queryDataUnknown, selectedFields) if len(infusionsoft.DataService('query', table, limit, searchPage, queryDataUnknown, selectedFields))<1000 else None for searchPage in range(1000)] for p in s][:allcancelledmembers.index(None)]
0
Ann Zen 15 jun. 2020 a las 20:44

Puede intercambiar pares clave: valor de su tagsDic también:

tagsDic2 = {value:key for key,value in tagsDic.items()}

Alternativamente, podría hacer algo como esto en su lista de comprensión:

d = {'1':'a', '2':'b'}
print([a[0] for a in d.items() if a[1]=='b' ][0])

print([a[0] for a in d.items() for x in ['a', 'c', 'd', 'b'] if x==a[1] ])

Que devuelve la clave de los pares (clave, valor), sin embargo, recomendaría encarecidamente que no lo haga. Es altamente ineficiente para diccionarios grandes o muchas consultas.

[a[0] for a in tagsDic.items() for x in record.get("Contact.Groups").split(',') if x==a[1] ]
0
caskuda 15 jun. 2020 a las 20:51