Как разделить список на группы по должностям?
У меня есть список:
['Захарычев', 'Junior-Разработчик', '50000', '8(916)523-**-**']
['test-case(spaces)', 'test', '50000', '8(916)523-**-**']
['test-case(lead-spaces)', 'test', '50000', '8(916)523-**-**']
['test-case(tail-spaces)', 'test', '50000', '8(916)523-**-**']
['Чукалов', 'инженер', '49999', '8(***)***-**-**']
['Безенков', 'инженер', '40000', '8(***)***-**-**']
['Королёв', 'web-программист', '30000', '8(***)***-__-__']
['ы', 'хирург', '220000', '8(***)***-__-__']
['ы', 'терапевт', '25000', '8(***)***-__-__']
['ы', 'уборщица', '15000', '8(***)***-__-__']
['ы', 'уборщица', '15000', '8(***)***-__-__']
['ы', 'уборщица', '15000', '8(***)***-__-__']
['ы', 'Senior-developer', '330000', '8(***)***-__-__']
['ы', 'Senior-developer', '345000', '8(***)***-__-__']
['ы', 'Middle-developer', '150000', '8(***)***-__-__']
Как правильней всего разделить список на списки с одинаковыми должностями?
Ответы (3 шт):
очень не однозначный вопрос. где гарантии, что список будет всегда именно таким? а если порядок аргументов поменяется? к тому же опечатка или же написание с заглавной буквы это уже по сути другая должность с точки зрения программы. я бы воспользовался словарем.
dictionary = {}
for element in lst:
position = element[1].lower()
if position not in dictionary.keys():
dictionary[position]= [element]
else:
dictionary[position].append(element)
это то, как можно гарантировать, что должности с одинаковым упорядоченным набором букв даже в разных регистрах попадут в одну категорию.
from itertools import groupby
lst = [['Захарычев', 'Junior-Разработчик', '50000', '8(916)523-**-**'],
['test-case(spaces)', 'test', '50000', '8(916)523-**-**'],
['test-case(lead-spaces)', 'test', '50000', '8(916)523-**-**'],
['test-case(tail-spaces)', 'test', '50000', '8(916)523-**-**'],
['Чукалов', 'инженер', '49999', '8(***)***-**-**'],
['Безенков', 'инженер', '40000', '8(***)***-**-**'],
['Королёв', 'web-программист', '30000', '8(***)***-__-__'],
['ы', 'хирург', '220000', '8(***)***-__-__'],
['ы', 'терапевт', '25000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'Senior-developer', '330000', '8(***)***-__-__'],
['ы', 'Senior-developer', '345000', '8(***)***-__-__'],
['ы', 'Middle-developer', '150000', '8(***)***-__-__']]
res = {}
for k, g in groupby(lst, key=lambda x: x[1]):
res.setdefault(k, list(g))
res (вывод для красоты сделал с помощью pretty print):
{ 'Junior-Разработчик': [ [ 'Захарычев',
'Junior-Разработчик',
'50000',
'8(916)523-**-**']],
'Middle-developer': [ [ 'ы',
'Middle-developer',
'150000',
'8(***)***-__-__']],
'Senior-developer': [ [ 'ы',
'Senior-developer',
'330000',
'8(***)***-__-__'],
[ 'ы',
'Senior-developer',
'345000',
'8(***)***-__-__']],
'test': [ ['test-case(spaces)', 'test', '50000', '8(916)523-**-**'],
['test-case(lead-spaces)', 'test', '50000', '8(916)523-**-**'],
['test-case(tail-spaces)', 'test', '50000', '8(916)523-**-**']],
'web-программист': [ [ 'Королёв',
'web-программист',
'30000',
'8(***)***-__-__']],
'инженер': [ ['Чукалов', 'инженер', '49999', '8(***)***-**-**'],
['Безенков', 'инженер', '40000', '8(***)***-**-**']],
'терапевт': [['ы', 'терапевт', '25000', '8(***)***-__-__']],
'уборщица': [ ['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__']],
'хирург': [['ы', 'хирург', '220000', '8(***)***-__-__']]}
Еще есть вариант использовать pandas. В этом случае я выведу результат в виде словаря словарей, с которым, возможно, будет удобнее работать:
import pandas as pd
res = pd.DataFrame(lst).groupby(1).agg(list).to_dict(orient="index")
res:
{ 'Junior-Разработчик': { 0: ['Захарычев'],
2: ['50000'],
3: ['8(916)523-**-**']},
'Middle-developer': {0: ['ы'], 2: ['150000'], 3: ['8(***)***-__-__']},
'Senior-developer': { 0: ['ы', 'ы'],
2: ['330000', '345000'],
3: ['8(***)***-__-__', '8(***)***-__-__']},
'test': { 0: [ 'test-case(spaces)',
'test-case(lead-spaces)',
'test-case(tail-spaces)'],
2: ['50000', '50000', '50000'],
3: ['8(916)523-**-**', '8(916)523-**-**', '8(916)523-**-**']},
'web-программист': {0: ['Королёв'], 2: ['30000'], 3: ['8(***)***-__-__']},
'инженер': { 0: ['Чукалов', 'Безенков'],
2: ['49999', '40000'],
3: ['8(***)***-**-**', '8(***)***-**-**']},
'терапевт': {0: ['ы'], 2: ['25000'], 3: ['8(***)***-__-__']},
'уборщица': { 0: ['ы', 'ы', 'ы'],
2: ['15000', '15000', '15000'],
3: [ '8(***)***-__-__',
'8(***)***-__-__',
'8(***)***-__-__']},
'хирург': {0: ['ы'], 2: ['220000'], 3: ['8(***)***-__-__']}}
в принципе, тот же результат можно получить и без groupby:
lst = [['Захарычев', 'Junior-Разработчик', '50000', '8(916)523-**-**'],
['test-case(spaces)', 'test', '50000', '8(916)523-**-**'],
['test-case(lead-spaces)', 'test', '50000', '8(916)523-**-**'],
['test-case(tail-spaces)', 'test', '50000', '8(916)523-**-**'],
['Чукалов', 'инженер', '49999', '8(***)***-**-**'],
['Безенков', 'инженер', '40000', '8(***)***-**-**'],
['Королёв', 'web-программист', '30000', '8(***)***-__-__'],
['ы', 'хирург', '220000', '8(***)***-__-__'],
['ы', 'терапевт', '25000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'уборщица', '15000', '8(***)***-__-__'],
['ы', 'Senior-developer', '330000', '8(***)***-__-__'],
['ы', 'Senior-developer', '345000', '8(***)***-__-__'],
['ы', 'Middle-developer', '150000', '8(***)***-__-__']]
res = {}
for l in lst:
res.setdefault(l[1], []).append(l)