Преобразование списка внутри списка в строку - python - PullRequest
0 голосов
/ 17 июня 2020

Я создал список, используя понимание списка, и мне было интересно, как преобразовать список в списке в строку.

Это мой код:

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]

Это исходный результат запроса от 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 возвращает:

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

Это мой желаемый результат:

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

Если нет, то как лучше всего выполнить sh это?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Вы можете создать общую (рекурсивную) функцию для сглаживания вложенного списка, например, этого, и использовать ее для сглаживания получаемого списка.

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']
0 голосов
/ 17 июня 2020

Поскольку я не узнаю модуль, который вы используете, это немного взломано. Тем не менее, все еще работает.

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