Обновление списка словарей удаление старой записи
Имею список словарей, где значение My_list может быть:
[
{user: 'test1' tel: ['1234']},
{user: 'test2' tel: ['12345', '123', '4589']},
{user: 'test3' tel: ['123458', '1235']}
]
Хочу получить:
[
{user: 'test1' tel: ['1234']},
{user: 'test2' tel: ['12345']},
{user: 'test2' tel: ['123']},
{user: 'test2' tel: ['4589']},
{user: 'test3' tel: ['123458']}
{user: 'test3' tel: ['1235']}
]
My_list = [
dict(user=item['attributes']['login'],
tel=item['attributes']['number']
)
for item in entry_list
if item['tel']
]
Ответы (2 шт):
Автор решения: icYFTL
→ Ссылка
Жтож,
import operator
a = [
{'user': 'test1', 'tel': ['1234']},
{'user': 'test2', 'tel': ['12345', '123', '4589']},
{'user': 'test3', 'tel': ['123458', '1235']}
]
_t = [{'user': x['user'], 'tel': [y]} for x in a for y in x['tel'][1:] if len(x['tel']) > 1]
[a[i]['tel'].remove(y) for i, x in enumerate(a) for y in x['tel'][1:] if len(x['tel']) > 1]
a += _t
del _t
a.sort(key=operator.itemgetter('user'))
print(a)
Автор решения: MaxU
→ Ссылка
Такие задачи легко решаются при помощи модуля Pandas:
import pandas as pd
res = (pd.DataFrame(data)
.explode("tel")
.set_index("user")
["tel"]
.apply(lambda x: [x])
.reset_index()
.to_dict("records"))
результат:
In [231]: res
Out[231]:
[{'user': 'test1', 'tel': ['1234']},
{'user': 'test2', 'tel': ['12345']},
{'user': 'test2', 'tel': ['123']},
{'user': 'test2', 'tel': ['4589']},
{'user': 'test3', 'tel': ['123458']},
{'user': 'test3', 'tel': ['1235']}]
Если же нужно получить телефоны не в списках, а как обычные строки, то решение будет выглядеть гораздо проще:
In [232]: res = pd.DataFrame(data).explode("tel").to_dict("records")
In [233]: res
Out[233]:
[{'user': 'test1', 'tel': '1234'},
{'user': 'test2', 'tel': '12345'},
{'user': 'test2', 'tel': '123'},
{'user': 'test2', 'tel': '4589'},
{'user': 'test3', 'tel': '123458'},
{'user': 'test3', 'tel': '1235'}]