Доступ к словарю внутри вложенного списка

#python #list #dictionary

Вопрос:

 [[{'id': 1772391,
   'prob': 0.8,
   'label': 'PERSON',
   'start_offset': 44,
   'end_offset': 52,
   'user': 15,
   'document': 1062501},
  {'id': 1772397,
   'prob': 0.8,
   'label': 'PERSON',
   'start_offset': 150,
   'end_offset': 169,
   'user': 15,
   'document': 1062501},
  {'id': 1772405,
   'prob': 0.8,
   'label': 'PERSON',
   'start_offset': 217,
   'end_offset': 226,
   'user': 15,
   'document': 1062501},
  {'id': 1772387,
   'prob': 0.8,
   'label': 'TITLE',
   'start_offset': 0,
   'end_offset': 21,
   'user': 15,
   'document': 1062501},
  {'id': 1772389,
   'prob': 0.8,
   'label': 'TITLE',
   'start_offset': 22,
   'end_offset': 39,
   'user': 15,
   'document': 1062501},
  {'id': 1772400,
   'prob': 0.8,
   'label': 'TITLE',
   'start_offset': 189,
   'end_offset': 203,
   'user': 15,
   'document': 1062501},
  {'id': 1772403,
   'prob': 0.8,
   'label': 'TITLE',
   'start_offset': 204,
   'end_offset': 216,
   'user': 15,
   'document': 1062501},
  {'id': 1772408,
   'prob': 0.8,
   'label': 'FACILITY',
   'start_offset': 285,
   'end_offset': 310,
   'user': 15,
   'document': 1062501},
  {'id': 1772396,
   'prob': 0.8,
   'label': 'ORG',
   'start_offset': 138,
   'end_offset': 150,
   'user': 15,
   'document': 1062501},
  {'id': 1772410,
   'prob': 0.8,
   'label': 'LOC',
   'start_offset': 312,
   'end_offset': 329,
   'user': 15,
   'document': 1062501}]]
 

Единственный список внутри списка.
Я пытаюсь получить доступ к start_offset и end_offset внутри списка.
Как получить к ним доступ?
Я попробовал этот код :

 [annotation[i][j]['end_offset'] for i,j in annotation]
 

P. S : аннотация-это имя вложенного списка

Комментарии:

1. «Я попробовал этот код :» Что произошло, когда вы попробовали этот код, и чем это отличается от того, что должно произойти?

2. «Единственный список внутри списка» Хорошо. Знаете ли вы, как написать код, который просто дает вам этот единственный список? (Подсказка: это элемент содержащего списка. Каков его индекс? Как вы получаете один элемент из списка, если вы знаете его индекс?) Как только вы получите этот список, сможете ли вы написать код для решения остальной части проблемы?

Ответ №1:

Вы имеете в виду под:

 >>> [{k: v for k, v in i.items() if k in ['start_offset', 'end_offset']} for x in annotation for i in x]
[{'start_offset': 44, 'end_offset': 52}, {'start_offset': 150, 'end_offset': 169}, {'start_offset': 217, 'end_offset': 226}, {'start_offset': 0, 'end_offset': 21}, {'start_offset': 22, 'end_offset': 39}, {'start_offset': 189, 'end_offset': 203}, {'start_offset': 204, 'end_offset': 216}, {'start_offset': 285, 'end_offset': 310}, {'start_offset': 138, 'end_offset': 150}, {'start_offset': 312, 'end_offset': 329}]
>>> 
 

Комментарии:

1. Я попытался составить список start_offset и end_offset вместо аннотации[0]. Я хочу, чтобы это было во всех аннотациях

2. Я хочу, чтобы это было в одном списке, а не отдельно

3. @zzzz Отредактировал мой ответ, теперь он должен сработать, пожалуйста, примите и поддержите его

4. Это так, как я могу сохранить значение dict от этого? Например {start_offset: 45, end_offset : 50 }

5. Печатается само значение.

Ответ №2:

Попробуйте этот код —

 lists = ([(i['start_offset'], i['end_offset']) for ele in annotation for i in ele])

start_offset = [i for i,j in lists]
end_offset= [j for i,j in lists]
 

Результат:

 print(start_offset)
[44, 150, 217, 0, 22, 189, 204, 285, 138, 312]

print(end_offset)
[52, 169, 226, 21, 39, 203, 216, 310, 150, 329]

# As a Single list
print(lists)
[(44, 52), (150, 169), (217, 226), (0, 21), (22, 39), (189, 203), (204, 216), (285, 310), (138, 150), (312, 329)]
 

Это будет работать, даже если у вас есть более одного списка.

Комментарии:

1. Я хочу, чтобы это был один список, извините

2. Попробуйте print lists , если вам нужен один список. Вам нужен список кортежей или список пустых значений

Ответ №3:

для смещения конца:

 final_list=[]
for item in annotation:
    for dict in item:
        final_list.append(dict['end_offset'])
print(final_list)
 

Выход:

 [52, 169, 226, 21, 39, 203, 216, 310, 150, 329]