将列表中的列表更改为字符串-python

将列表中的列表更改为字符串-python,python,list-comprehension,Python,List Comprehension,我使用列表理解创建了一个列表,我想知道如何将列表中的列表更改为字符串 这是我的代码: limit = 1000 searchPage = 0 tagId = 493 table = 'ContactGroupAssign' selectedFields = ['Contact.Id', 'DateCreated', 'Contact.OwnerID', 'Contact.Groups'] queryDataUnknown = {'GroupId': tagId, 'DateCreated': "

我使用列表理解创建了一个列表,我想知道如何将列表中的列表更改为字符串

这是我的代码:

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"), [k for k, v in tagsDic.items() if v in (record.get("Contact.Groups"))]] for record in allcancelledmembers]
这是我想要的结果:

[68505, datetime.datetime(2019, 1, 9, 9, 10, 52), 384114, '130,134,136,138,152,206,208,286,290,312,436,493,495,728,760,772,774,788,952,968,1088,1226,1254,2362,2584,2598,2972,2974,3102,3560,4552,4554,5430,6566,6950,7226,8156,8160,8412,8418,8672,8744,9179,9273,10738', 'Unknown','NBDK']
新结果中唯一的区别是只将每条记录的最后一项从['Unknown','NBDK']更改为'Unknown','NBDK'

有没有办法通过修改我代码中的这一行来做到这一点:

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"))]] for record in allcancelledmembers]
如果没有,实现这一目标的最佳方式是什么


谢谢

由于我不认识您正在使用的模块,因此这有点不规范。但仍然有效

import datetime

def cleanContacts(A):
    return A[:-1] + A[-1]

A = [68505, datetime.datetime(2019, 1, 9, 9, 10, 52), 384114, '130,134,136,138,152,206,208,286,290,312,436,493,495,728,760,772,774,788,952,968,1088,1226,1254,2362,2584,2598,2972,2974,3102,3560,4552,4554,5430,6566,6950,7226,8156,8160,8412,8418,8672,8744,9179,9273,10738', ['Unknown', 'NBDK']]
C = [68505, datetime.datetime(2019, 1, 9, 9, 10, 52), 384114, '130,134,136,138,152,206,208,286,290,312,436,493,495,728,760,772,774,788,952,968,1088,1226,1254,2362,2584,2598,2972,2974,3102,3560,4552,4554,5430,6566,6950,7226,8156,8160,8412,8418,8672,8744,9179,9273,10738', 'Unknown','NBDK']
assert cleanContacts(A) == C
另外,如果我正确地猜测要弹出打开的元素来自最后一个列表理解,那么这颗星将起作用

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"))]] for record in allcancelledmembers]
您可以创建一个通用(递归)函数来展平嵌套列表,如下图所示,并使用它展平您得到的列表

def flatten_list(lst):
    for member in lst:
        if isinstance(member, list):
            for mem in flatten_list(member):
                yield mem
        else:
            yield member

if __name__ == '__main__':

    import datetime
    lst = [68505, datetime.datetime(2019, 1, 9, 9, 10, 52), 384114, '130,134,136,138,152,206,208,286,290,312,436,493,495,728,760,772,774,788,952,968,1088,1226,1254,2362,2584,2598,2972,2974,3102,3560,4552,4554,5430,6566,6950,7226,8156,8160,8412,8418,8672,8744,9179,9273,10738', ['Unknown', 'NBDK']]

    print(list(flatten_list(lst)))
给出:

[68505, datetime.datetime(2019, 1, 9, 9, 10, 52), 384114, '130,134,136,138,152,206,208,286,290,312,436,493,495,728,760,772,774,788,952,968,1088,1226,1254,2362,2584,2598,2972,2974,3102,3560,4552,4554,5430,6566,6950,7226,8156,8160,8412,8418,8672,8744,9179,9273,10738', 'Unknown', 'NBDK']

谢谢你@JimmyCarlos!并非每个记录都有两个值,如['Unknown','NBDK']。如果最后一项有两个值,有没有办法只获取最后一项?这样::[k代表k,v在tagsDic.items()中,如果v在(record.get(“Contact.Groups”)][-1]]中,这给了我一个列表索引超出范围的错误,所以我只是想知道这是否可能。如果您只想要最后一个值,您可以像[k代表k,v在tagsDic.items()中,如果v在(record.get(“Contact.Groups”)][-1]中一样,不需要*作为[-1]已断开列表以获取最后一个元素。这将导致列表索引超出范围错误。我尝试了[k代表k,v在tagsDic.items()中,如果v在(record.get(“Contact.Groups”)][-1]]中代表所有取消成员中的record]。去掉最后一个方括号,我会看到未解决的引用错误,最好开始把它分成两行。将主要内容放在第1行,然后在第二行做列表+=[k代表k,v….],将两个列表连接在一起。
def flatten_list(lst):
    for member in lst:
        if isinstance(member, list):
            for mem in flatten_list(member):
                yield mem
        else:
            yield member

if __name__ == '__main__':

    import datetime
    lst = [68505, datetime.datetime(2019, 1, 9, 9, 10, 52), 384114, '130,134,136,138,152,206,208,286,290,312,436,493,495,728,760,772,774,788,952,968,1088,1226,1254,2362,2584,2598,2972,2974,3102,3560,4552,4554,5430,6566,6950,7226,8156,8160,8412,8418,8672,8744,9179,9273,10738', ['Unknown', 'NBDK']]

    print(list(flatten_list(lst)))
[68505, datetime.datetime(2019, 1, 9, 9, 10, 52), 384114, '130,134,136,138,152,206,208,286,290,312,436,493,495,728,760,772,774,788,952,968,1088,1226,1254,2362,2584,2598,2972,2974,3102,3560,4552,4554,5430,6566,6950,7226,8156,8160,8412,8418,8672,8744,9179,9273,10738', 'Unknown', 'NBDK']