Как сравнить одинаковое значение в двух строках? 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}