Как сравнить одинаковое значение в двух строках? Python

Есть сырые данные asterisk в таком виде

"autodialer","2222","i","zvonar-informer",""""" <2222>","Local/89039904644@zvonar-dialer-00000097;1","","Goto","zvonar-informer,background","2021-03-15 08:23:10","2021-03-15 08:23:21","2021-03-15 08:23:46",36,25,"ANSWERED","DOCUMENTATION","1615796590.5115",""
"autodialer","2222","89039904644","zvonar-dialer",""""" <2222>","Local/89039904644@zvonar-dialer-00000097;2","SIP/zadarma-00001261","Dial","SIP/zadarma/+79039904644,40","2021-03-15 08:23:10","2021-03-15 08:23:21","2021-03-15 08:23:46",36,25,"ANSWERED","DOCUMENTATION","1615796590.5116",""
"autodialer","2222","89039904644","zvonar-dialer",""""" <2222>","Local/89039904644@zvonar-dialer-0000009b;2","SIP/zadarma-00001295","Dial","SIP/zadarma/+79039904644,40","2021-03-15 08:40:19",,"2021-03-15 08:40:50",30,0,"NO ANSWER","DOCUMENTATION","1615797619.5176",""
"autodialer","2222","89039904644","zvonar-dialer",""""" <2222>","Local/89039904644@zvonar-dialer-0000009c;2","SIP/zadarma-00001296","Dial","SIP/zadarma/+79039904644,40","2021-03-15 08:41:02",,"2021-03-15 08:41:14",11,0,"BUSY","DOCUMENTATION","1615797662.5179",""

я добавил их в dict с указанием наименований объектов

{'status': 'ANSWERED', 'uniqueid': 1615796590, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Goto', 'dcontext': 'i'}
{'status': 'ANSWERED', 'uniqueid': 1615796590, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}
{'status': 'ANSWERED', 'uniqueid': 1615796825, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Hangup', 'dcontext': '1'}
{'status': 'ANSWERED', 'uniqueid': 1615796825, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}
{'status': 'ANSWERED', 'uniqueid': 1615797348, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Goto', 'dcontext': 't'}
{'status': 'ANSWERED', 'uniqueid': 1615797348, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}
{'status': 'ANSWERED', 'uniqueid': 1615797554, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}
{'status': 'ANSWERED', 'uniqueid': 1615797554, 'callerid': '2222', 'callid': '89039904644', 'dst': 'BackGround', 'dcontext': '2222'}
{'status': 'NO ANSWER', 'uniqueid': 1615797619, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}
{'status': 'BUSY', 'uniqueid': 1615797662, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}

код python который это обрабатывает

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import csv

def csv_reader(file_obj):
    reader = csv.reader(file_obj)
    result = []
    for row in reader:
        rows = dict(uniqueid=int(float((row[16]))), callerid=row[1], dcontext=row[2], callid=row[5][6:17], dst=row[7], status=row[14])
        result.append(rows)
    for results in result:
        print(results)

if __name__ == '__main__':
    csv_path = "autodialer.csv"
    with open(csv_path, "r") as f_obj:
        csv_reader(f_obj)

Вопрос, как сравнить uniqueid поля в 2-х строках если они одинаковы и затем без повторений записать их в таком виде

{'status': 'ANSWERED', 'uniqueid': 1615796590, 'callerid': '2222', 'callid': '89039904644', 'dst': {'Goto', 'Dial'}, 'dcontext': {'i', '89039904644'}}

А если строка с uniqueid одна то оставить это без изменений, например так

{'status': 'BUSY', 'uniqueid': 1615797662, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}

Ответы (1 шт):

Автор решения: insolor

Можно использовать функцию itertools.groupby для группировки по uniqueid:

from itertools import groupby

data = [
    {'status': 'ANSWERED', 'uniqueid': 1615796590, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Goto', 'dcontext': 'i'},
    {'status': 'ANSWERED', 'uniqueid': 1615796590, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'},
    {'status': 'ANSWERED', 'uniqueid': 1615796825, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Hangup', 'dcontext': '1'},
    {'status': 'ANSWERED', 'uniqueid': 1615796825, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'},
    {'status': 'ANSWERED', 'uniqueid': 1615797348, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Goto', 'dcontext': 't'},
    {'status': 'ANSWERED', 'uniqueid': 1615797348, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'},
    {'status': 'ANSWERED', 'uniqueid': 1615797554, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'},
    {'status': 'ANSWERED', 'uniqueid': 1615797554, 'callerid': '2222', 'callid': '89039904644', 'dst': 'BackGround', 'dcontext': '2222'},
    {'status': 'NO ANSWER', 'uniqueid': 1615797619, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'},
    {'status': 'BUSY', 'uniqueid': 1615797662, 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644'}
]

for key, group in groupby(data, key=lambda item: item['uniqueid']):
    group = list(group)
    dsts = [item['dst'] for item in group]
    dcontexts = [item['dcontext'] for item in group]

    new_item = group[0].copy()
    if len(dsts) > 1:
        new_item['dst'] = dsts
        new_item['dcontext'] = dcontexts
    print(new_item)

Вывод:

{'status': 'ANSWERED', 'callerid': '2222', 'callid': '89039904644', 'dst': ['Goto', 'Dial'], 'dcontext': ['i', '89039904644'], 'uniqueid': 1615796590}
{'status': 'ANSWERED', 'callerid': '2222', 'callid': '89039904644', 'dst': ['Hangup', 'Dial'], 'dcontext': ['1', '89039904644'], 'uniqueid': 1615796825}
{'status': 'ANSWERED', 'callerid': '2222', 'callid': '89039904644', 'dst': ['Goto', 'Dial'], 'dcontext': ['t', '89039904644'], 'uniqueid': 1615797348}
{'status': 'ANSWERED', 'callerid': '2222', 'callid': '89039904644', 'dst': ['Dial', 'BackGround'], 'dcontext': ['89039904644', '2222'], 'uniqueid': 1615797554}
{'status': 'NO ANSWER', 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644', 'uniqueid': 1615797619}
{'status': 'BUSY', 'callerid': '2222', 'callid': '89039904644', 'dst': 'Dial', 'dcontext': '89039904644', 'uniqueid': 1615797662}
→ Ссылка