2016-01-18 6 views
1

Я не могу опустить голову над этим. Или я слишком усложняю вещи? Я пытаюсь сделать этот код более «Pythonic».Понимание Python, словарь списков

statuses = {record['id'] : [] for record in data} 

for record in data: 
    for status in record['statuses']: 
     data = { 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
     } 

     if 'statusLongDesc' in status: 
      data.update({'long_desc': status['statusLongDesc']}) 
     else: 
      data.update({'long_desc': ''}) 

     statuses[record['id']] += [data] 
    } 
} 

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

  • Как обновить список в словаре в понимание? Вдоль линий этого. Будет ли это работать? Что-то мне не кажется правильным. Разве я увлекся фигурными скобками?

    statuses = { 
        { 
         record['id']: list({ 
          'status_code': status['statusCode'], 
          'short_desc': status['statusShortDesc'], 
          'long_desc': '' 
         }) 
        } 
        for record in data for status in record['statuses'] 
    } 
    

Это производит TypeError: unhashable type: 'dict'

  • Как я тогда не повторить ту часть данных, как в моем исходном коде для настройки long_desc? (Мой словарь на самом деле намного длиннее, и кажется сумасшедшим повторить все это для одной строки.) Например: then if 'statusLongDesc' in status list.extend('long_desc': status['statusLongDesc']), добавленный к вышеуказанному пониманию.
+0

Ваш оригинальный код намного более «pythonic» IMO. Это очень легко читать, и цель понятна. Быть питоническим означает короткий, лаконичный и легко читаемый. –

ответ

2

Я бы не переусердствовал. Самое большое, что вы можете использовать для упрощения вашего оригинала, - использовать метод get.

statuses = {record['id']: [] for record in data} 

for record in data: 
    for status in record['statuses']:   
     statuses[record['id']].append({ 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
      'long_desc': status.get('statusLongDesc', ''), 
     }) 

Теперь, если вы хотите, вы можете заменить петли на понимание dict, которое использует понимание списка.

statuses = { record['id']: [{...} for status in record['statuses']] for record in data } 

где {...} является data ДИКТ в оригинале.

+0

Мне кажется странным, как он переплетает «данные», итерации по нему. – GingerPlusPlus

+0

Хорошая точка. Я полностью избавлюсь от временного имени в ответе, так как это необязательно. – chepner

+0

Спасибо. get method - новый, который я не забуду. Handy. – s27840

1

Вы можете легко создать список с помощью понимания, а не .append Инг:

statuses = {} 

for record in data: 
    statuses[record['id']] = [ 
     { 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
      'long_desc': status.get('statusLongDesc', ''), 
     } for status in record['statuses'] 
    ] 

Она также может быть сделана в одном выражении этого пути, если бы я был вложены постижения права:

statuses = { 
    record['id']: [{ 
      'status_code': status['statusCode'], 
      'short_desc': status['statusShortDesc'], 
      'long_desc': status.get('statusLongDesc', ''), 
     } for status in record['statuses'] 
    ] for record in data 
} 

Но Я считаю это нечитаемым.

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