繁体   English   中英

在列表中查找字典值并使用列表理解附加匹配键

[英]Finding a dictionary value in a list and appending the matching key with list comprehension

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

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

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

该值将在 Contact.Groups 字段中,并且查询返回联系人具有的每个标签 ID 的字符串,例如“123,233,455,1123,5569,10123”。

因此,如果“,10738”在 Contact.Groups 中,我想在该记录中添加“未知”。

有没有办法在我的代码的最后一行使用列表理解来做到这一点?

这是 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']

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

'''

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

从:

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

至:

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

您也可以交换tagsDic的 key:value 对:

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

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

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

'Unknown' if '10738' in record.get('Contact.Groups') else ''

如果“Contact.Groups”中的“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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM