在列表中找到一个字典值,并将匹配的键附加到列表理解中。

问题描述 投票:0回答:1

我是Python新手,想知道如何解决这个问题。

我有一个名为 tagsDic 的字典,它的键是取消原因,值是标签 ID。

我正在从 CRM 中查询联系人,并将它们存储在一个列表中 (allcancelledmembers)。如果记录中有来自 tagsDic 的值,我想将匹配的键添加到列表中的每条记录中。

该值将在 Contact.Groups 字段中,查询返回联系人拥有的每个标签 id 的字符串,如 '123,233,455,1123,5569,10123'。

因此,如果',10738'在Contact.Group中,我想将'未知'添加到该记录中。

有没有办法在我的代码的最后一行使用list comprehension来实现呢?

这是在allcancelledmembers中的一个记录的例子。

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

这就是我希望最后一行用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']

"未知 "被添加到lc_allcancelmembers记录的末尾 因为',10738'在allcancelledmembers的Contact.Groups字段中。

谢谢!这是我正在做的代码。

这是我正在使用的代码。'''

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]

'''

python list-comprehension
1个回答
0
投票

将此添加到 'Unknown' if '10738' in record.get('Contact.Groups') else '' 您的列表理解代码。

如果'Contact.Group'中的'10738',它将添加'未知'到列表中,否则将添加一个空字符串。

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
投票

假设你的代码是正确的,这就是如何在列表理解中实现它。

发件人:

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

To:

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
投票

你可以把你的key:value对换成你的 tagsDic 以及。

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

或者你可以在你的列表理解中做这样的事情:

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

返回(key, value)对的key,但是我强烈建议不要这样做。对于大型字典或大量的查询,它的效率非常低。

[a[0] for a in tagsDic.items() for x in record.get("Contact.Groups").split(',') if x==a[1] ]
© www.soinside.com 2019 - 2024. All rights reserved.