Python как перебрать значение по ключу в список?

Здравствуйте нужна помощь профессионалов!
Есть структура списка с словарями

list = [
	{'name': 'Pavel', 'id': '233082', 'pos': ['85742', '95380', '40979']},
	...
	{'name': 'Oleg', 'id': '233082', 'pos': ['81052', '8316', '3062']},
	{'name': 'Oleg', 'id': '233082', 'pos': ['41052', '5318', '2304']},
	{'name': 'Oleg', 'id': '233082', 'pos': ['21050', '1317', '9305.']},
	...
	{'name': 'Nikolay', 'id': '233082', 'pos': ['25781', '94116', '20264']},
]


Как можно её перебрать и реализовать следующею структуру

list = [
	{'name': 'Pavel', 'id': '233082', 'pos': ['85742', '95380', '40979']},
	...
	{'name': 'Oleg', 'id': '233082', 'pos': [['81052', '8316', '3062'], 
											           ['41052', '5318', '2304'], 
											           ['21050', '1317', '9305.']]
	},
	...
	{'name': 'Nikolay', 'id': '233082', 'pos': ['25781', '94116', '20264']},
]


Заранее спасибо!
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Вот так, например.

from itertools import groupby

[
    dict(
        name=name, 
        id=id, 
        pos=[subitem['pos'] for subitem in subitems]
    ) 
    for (name, id), subitems in 
    groupby(
        dic, 
        lambda item: (item['name'], item['id'])
    )
]

Только у вас там, похоже, ошибка в примере для случаев с одиночными вхождениями. Не хватает двойного вложенного списка.
Если нужно именно так, то нужно будет добавить "раздевание" одноэлементных списков.

Не забудьте предварительную сортировку, если группируемые элементы могут быть не рядом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
aRegius
@aRegius
Python Enthusiast
from collections import defaultdict

pos_group_dict = defaultdict(list)
for data_dict in data:
      pos_group_dict[(data_dict['name'], data_dict['id'])].append(data_dict['pos'])
new_data = [{'name': key[0], 'id': key[1], 'pos': value} for key, value in pos_group_dict.items()]
Ответ написан
LazyTalent
@LazyTalent
Data Engineer, Freelancer
from pprint import pprint
import pandas as pd

dic = [
  {'name': 'Pavel', 'id': '233082', 'pos': ['85742', '95380', '40979']},
  {'name': 'Oleg', 'id': '233082', 'pos': ['81052', '8316', '3062']},
  {'name': 'Oleg', 'id': '233082', 'pos': ['41052', '5318', '2304']},
  {'name': 'Oleg', 'id': '233082', 'pos': ['21050', '1317', '9305.']},
  {'name': 'Nikolay', 'id': '233082', 'pos': ['25781', '94116', '20264']},
]

df = pd.DataFrame(dic)
# print(df)
#       name      id                    pos
# 0    Pavel  233082  [85742, 95380, 40979]
# 1     Oleg  233082    [81052, 8316, 3062]
# 2     Oleg  233082    [41052, 5318, 2304]
# 3     Oleg  233082   [21050, 1317, 9305.]
# 4  Nikolay  233082  [25781, 94116, 20264]

foo = {'pos': lambda rows: [x for x in rows] if len(rows) > 1 else rows, 'name': 'first', 'id': 'first'}

df = df.groupby('name').aggregate(foo).to_dict(orient='record')

# pprint(df)
# [{'id': '233082', 'name': 'Nikolay', 'pos': ['25781', '94116', '20264']},
#  {'id': '233082',
#   'name': 'Oleg',
#   'pos': [['81052', '8316', '3062'],
#           ['41052', '5318', '2304'],
#           ['21050', '1317', '9305.']]},
#  {'id': '233082', 'name': 'Pavel', 'pos': ['85742', '95380', '40979']}]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
iCode Москва
от 90 000 до 200 000 ₽
SwapZilla.co Сочи
от 200 000 ₽
SwapZilla.co Москва
от 200 000 ₽