2014-01-27 6 views
0

У меня есть структура данных с большим количеством дублирования. Если я создать отфильтрованный список перечислить все уникальные типы, яСоздание списка списков без дублирования

type_ids = [] 
for record in file: 
    type_id = record['type_id'] 
    if type_id not in type_ids: 
     type_ids.append(type_ids) 

, и я получу что-то вроде type_ids=['A','B','G']. Теперь я хочу что-то вроде описательным названием Fo типа вместе с идентификатором, в структуре, как types = [ ['A','Alpha'], ['B','Beta'], ['G','Gamma'] ] я попытался

types = [] 
for record in file: 
    type_id = record['type_id'] 
    type_name = record['type_name'] 
    if [type_id,type_name] not in types: 
     types.append([type_id,type_name]) 

получить список, но с большим количеством дублирования и не всех типов представлены. Что не так в этом коде?

+1

Для данных, которые вы хотите представить, я определенно рекомендую словарь. – jayelm

+0

У меня уже есть словарь, из которого я извлекаю эти данные. Мне нужно передать эти уникальные идентификаторы типов и их имена в таблицу базы данных. – yayu

+0

Поймите, нет списков в 'type_ids', если он имеет формат' ['A', 'B' 'G'] '. Ваш оператор 'if' во втором блоке кода спрашивает, есть ли вложенный список' [type_id, type_name] 'inside' type_ids', который никогда не будет истинным, поэтому ваш блок 'if' всегда будет выполнен. – jayelm

ответ

1
types = set((r['type_id'], r['type_name']) for r in file) 

Python имеет set типа встроенные, который представляет собой неупорядоченный набор элементов. Вы можете создать набор уникальных кортежей (type_id, type_name) с этой одной строкой.

+0

спасибо. это очень странно. Мне нужна эта структура данных, чтобы быть изменчивой, хотя, чтобы добавить больше данных позже. что бы вы предложили в этом случае? – yayu

1

В вашем исходном коде ваш оператор if всегда будет выполнен, что, вероятно, приведет к большому количеству повторений. type_ids - список строк; ваш оператор if проверяет принадлежность к списку. В type_ids нет списков формы [type_id, type_name]. Я не уверен, что вы ищете членство в уже существующем type_ids или членство в списке types, который вы строите.

Скорее всего, вы хотите что-то вроде этого:

types = [] 
for record in file: 
    type_id = record['type_id'] # Assuming these two lines get the data correctly 
    type_name = record['type_name'] 
    if type_id not in type_ids: # e.g. if 'A' in ['A', 'B', 'C'] 
    # OR, if [type_id, type_name] not in types: 
     types.append([type_id], [type_name]) 

Но я бы рекомендовал хранить информацию в формате dictionary, который разработан специально для связанных пар ключ-значение:

types = {} 
for record in file: 
    type_id = record['type_id'] 
    type_name = record['type_name'] 
    if type_id not in type_ids: 
    # OR, if type_id not in types: 
     types[type_id] = type_name 
+0

Я редактировал свой вопрос. Это была типичная ошибка при абстрагировании вопроса от проблемы в моей программе. Дублирование сохраняется с этим редактированием. – yayu

+0

@yayu Что такое 'файл'? – jayelm

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