0
votes

Recherche d'une valeur de dictionnaire dans une liste et ajout de la clé correspondante avec la compréhension de la liste

Je suis nouveau dans Python et je me demande comment résoudre ce problème ...

J'ai un dictionnaire appelé tagsDic qui a une raison d'annulation comme clé et un identifiant de balise comme valeur.

J'interroge les contacts de mon CRM et je les stocke dans une liste (tous les membres annulés). Si une valeur de tagsDic est dans l'enregistrement, je souhaite ajouter la clé correspondante à chaque enregistrement de la liste.

La valeur se trouverait dans le champ Contact.Groups et la requête renvoie une chaîne de chaque identifiant de balise que le contact a, comme '123,233,455,1123,5569,10123'.

Donc, si ', 10738' est dans les Contact.Groups, je voudrais ajouter 'Inconnu' à cet enregistrement.

Existe-t-il un moyen de faire cela en utilisant la compréhension de liste dans la dernière ligne de mon code?

Voici un exemple d'enregistrement dans tous les membres annulés:

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]

Et voici ce que j'aurais aimé renvoyer avec la dernière ligne avec 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']

'Inconnu' est ajouté à la fin de l'enregistrement dans lc_allcancelmembers car ', 10738' était dans le champ Contact.Groups de tous les membres annulés.

Merci !

Voici le code avec lequel je travaille: '' '

{'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}

' ''


4 commentaires

vous utilisez uniquement la compréhension de liste, qu'est-ce qui ne va pas avec votre code et quelle est exactement votre question?


Comment trouver la valeur du dictionnaire ci-dessus et ajouter la clé correspondante à chaque enregistrement? Puis-je combiner cela dans la dernière ligne de mon code où je fais la compréhension de la liste?


pouvez-vous publier les données de tous les membres annulés et votre résultat attendu


vient de l'ajouter à la question, merci!


3 Réponses :


0
votes

En supposant que votre code est correct, voici comment l'implémenter dans une compréhension de liste:

De:

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)]

À:

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


0 commentaires

0
votes

Vous pouvez échanger les paires clé: valeur de vos tagsDic ainsi que:

[a[0] for a in tagsDic.items() for x in record.get("Contact.Groups").split(',') if x==a[1] ]

Sinon, vous pouvez faire quelque chose comme ça dans votre compréhension de liste:

XXX

qui renvoie la clé des paires (clé, valeur), mais je vous le déconseille fortement. Son très inefficace pour les gros dictionnaires ou beaucoup de requêtes.

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] ])


0 commentaires

0
votes

Ajoutez ceci dans 'Inconnu' si '10738' dans record.get ('Contact.Groups') else '' votre code de compréhension de liste.

Il ajoutera "Inconnu" à la liste si "10738" dans "Contact.Groups" sinon il ajoutera une chaîne vide.

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]


6 commentaires

Existe-t-il un moyen d'utiliser votre suggestion pour trouver la valeur dans les tagsDic comme ça? lc_allcancelmembers = [[record.get ("Contact.Id"), convert_is_datetime (str (record.get ("DateCreated"))), record.get ("Contact.OwnerID"), record.get ("Contact.Groups" ), tagsDic [clé] si tagsDic [valeur] dans record.get ("Contact.Groups") else 'None'] pour enregistrement dans tous les membres annulés]


@PrestonG voulez-vous vérifier tous les numéros "Contact.Groups"


Contact.Groups de chaque enregistrement doit avoir l'une des valeurs de tagsDic. Et quelle que soit la valeur trouvée dans Contact.Groups, la clé correspondante dans tagsDic serait ajoutée dans la dernière partie de la formule que vous avez suggérée


il y a beaucoup de nombres dans 'Contact.Groups' voulez-vous vérifier pour chaque valeur


ouais si c'est possible ce serait super


si vous utilisez la compréhension de liste, il retournera une liste, c'est ok. Sinon, vous pouvez trouver une valeur unique et l'ajouter à la liste lc_allcancelmembers