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}
' ''
3 Réponses :
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
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] ])
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]
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
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 attenduvient de l'ajouter à la question, merci!