2013-08-02 4 views
0

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

Ex:

[{'clerk': ['math ability','writing ability',...etc]},{'salesman':['charisma','writing ability','etc']}] 

Это данные, которые я работаю с:

O*NET-SOC Code Element ID Element Name Scale ID Data Value N Standard Error Lower CI Bound Upper CI Bound Recommend Suppress Not Relevant Date Domain Source 
11-1011.00 1.A.1.a.1 Oral Comprehension IM 4.5 8 0.19 4.13 4.87 N n/a Jun-06 Analyst 
11-1011.00 1.A.1.a.1 Oral Comprehension LV 4.75 8 0.25 4.26 5.24 N N Jun-06 Analyst 
11-1011.00 1.A.1.a.2 Written Comprehension IM 4.38 8 0.18 4.02 4.73 N n/a Jun-06 Analyst 

И это то, что я сделал до сих пор:

Сначала я создаю список словарей, каждый из которых представляет строку в приведенных выше данных с ключами = для имен столбцов значения vals = column. Пример:

OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.19'), ('Element ID', '1.A.1.a.1'), ('N', '8'), ('Scale ID', 'IM'), ('Not Relevant', 'n/a'), ('Element Name', 'Oral Comprehension'), ('Lower CI Bound', '4.13'), ('Date', '06/2006'), ('Data Value', '4.50'), ('Upper CI Bound', '4.87'), ('O*NET-SOC Code', '11-1011.00')]), OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.25'), ('Element ID', '1.A.1.a.1'), ('N', '8'), ('Scale ID', 'LV'), ('Not Relevant', 'N'), ('Element Name', 'Oral Comprehension'), ('Lower CI Bound', '4.26'), ('Date', '06/2006'), ('Data Value', '4.75'), ('Upper CI Bound', '5.24'), ('O*NET-SOC Code', '11-1011.00')]), OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.18'), ('Element ID', '1.A.1.a.2'), ('N', '8'), ('Scale ID', 'IM'), ('Not Relevant', 'n/a'), ('Element Name', 'Written Comprehension'), ('Lower CI Bound', '4.02'), ('Date', '06/2006'), ('Data Value', '4.38'), ('Upper CI Bound', '4.73'), ('O*NET-SOC Code', '11-1011.00')]), OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.32'), ('Element ID', '1.A.1.a.2'), ('N', '8'), ('Scale ID', 'LV'), 

И тогда я пытаюсь объединить словари в меньшее количество словарей, где каждый ключ является код задания, и каждое значение представляет собой список способностей, связанных с этой работой.

def add_abilites(abilites_m_l): 
    jobs_list = [] 
    for ind, dict in enumerate(abilites_m_l): 
     activities_list = [] 
     if abilities_m_l[ind-1]['O*NET-SOC Code'] == abilities_m_l[ind]['O*NET-SOC Code']: 
      if abilities_m_l[ind]['Element Name'] != abilities_m_l[ind-1]['Element Name']: 
       activities_list.append(abilities_m_l[ind]['Element Name']) 
      else: pass 
     else: list.append({abilities_m_l[ind]['O*NET-SOC Code']:activities_list})   
    return jobs_list 
a_l_with_abilities = add_abilites(abilities_m_l) 
print a_l_with_abilities 

я получаю следующий результат:

[{'11-1011.00': []}, {'11-1021.00': []}, {'11-2011.00': []}, {'11-2021.00': []}, {'11-2022.00': []}, {'11-2031.00': []}, {'11-3011.00': []}, {'11-3021.00': []}, {'11-3031.01': []}, {'11-3031.02': []}, {'11-3051.00': []}, {'11-3051.01': []}, {'11-3051.02': []}, {'11-3051.04': []}, {'11-3061.00': []}, {'11-3071.01': []}, {'11-3071.02': []}, {'11-3071.03': []}, {'11-3111.00': []}, {'11-3121.00': []}, {'11-3131.00': []}, {'11-9013.01': []}, {'11-9013.03': []}, {'11-9021.00': []}, {'11-9031.00': []}, {'11-9032.00': []}, {'11-9033.00': []}, {'11-9041.00': []}, {'11-..... 

Другими словами, мои списки не заполнены.

+4

Не указывайте свои списки 'list'. – wflynny

+1

Чтобы уточнить точку Билла - это переопределяет встроенный тип 'list' в вашем пространстве имен. Это не просто проблема стиля. –

+0

Это также не очень хорошая форма, чтобы называть словари 'dict'. – lmjohns3

ответ

1

Основная проблема заключается в том, что вы переназначаете activities_list в пустой список для каждого словаря в вашем abilities_m_l. Поэтому, когда вы обнаруживаете измененное значение «O * NET-SOC code», вы добавляете пустой список, который вы только что переназначили.

Вот уборщик способ сделать это:

def add_abilities(abilities_m_l): 
    jobs_dict = OrderedDict() 
    for data_dict in abilities_m_l: 
     o_code = data_dict['O*NET-SOC Code'] 
     activity = data_dict['Element Name'] 
     activities_so_far = jobs_dict.setdefault(o_code, OrderedDict()) 
     activities_so_far[activity] = True 
    return [{o_code: activities.keys()} for o_code, activities in jobs_dict.iteritems()] 

Или, если вы на Python 3, где keys, values и items вызовы возвращают итерируемых, а не списки:

return [{o_code: list(activities.keys())} for o_code, activities in jobs_dict.items()] 

Или , если вам не нужен порядок сохраненных действий, используйте для этого действия set. Это предпочтительнее, но у Python, к сожалению, нет родного OrderedSet, поэтому я аппроксимировал его выше с помощью OrderedDict, содержащего True за действия, найденные для кода.

def add_abilities(abilities_m_l): 
    jobs_dict = OrderedDict() 
    for data_dict in abilities_m_l: 
     o_code = data_dict['O*NET-SOC Code'] 
     activity = data_dict['Element Name'] 
     activities_so_far = jobs_dict.setdefault(o_code, set) 
     activities_so_far.add(activity) 
    return [{o_code: list(activities)} for o_code, activities in jobs_dict.iteritems()] 

Дело в том, чтобы словари языка Python собрать информацию об общих ключей, а также поддерживать уникальность деятельности для каждого кода.

+0

Очень полезно, Питер! Поэтому я пытаюсь передать список данных_dicts этой функции и получить файл «/ private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/bls-397498141.629.py», строка 229, в ability_struct = add_abilities (ability_m_l)) Файл «/ private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Очистка при запуске/bls-397498141.629.py», строка 227, в add_abilities return [{o_code, Activities.keys()} для o_code, действия в jobs_dict.iteritems()] ТипError: unhashable type: 'list' – goldisfine

+0

Я использовал неправильный синтаксис - должен быть 'return [{o_code: Activities.keys()} для o_code, действия в jobs_dict.iteritems()]' Вместо запятой двоеточия, это похоже на набор литералов, а список 'activities.keys()' не может быть в наборе, так как это несимметричный тип. Кроме того, я вижу, что мои операторы возврата недостаточно отступы - я тоже отредактирую, чтобы исправить это. –

Смежные вопросы