2013-07-31 5 views
1

Мне нужно создать список не дублированных целочисленных элементов из списка объектов.Создать список целых элементов из списка объектов

Например: Существует объект с двумя атрибутами: «Идентификатор» и «other_id»:

first = [elem.id for elem in objects_list] 
second = [elem.other_id for elem in objects_list] 
print first 
[0,1,2,3,4,5] 
print second 
[4,5,6,7,9] 

Теперь я могу создать два списка, содержащий, что два атрибута из всех объектов, как это:

first = [elem.id for elem in objects_list] 
first.extend(elem.other_id for elem in objects_list if elem.other_id not in first) 
print first 
[0,1,2,3,4,5,6,7,9] 

Есть ли способ сделать это короче?

ответ

1

Используйте set:

sorted(set().union(first, second)) #returns a sorted list of unique items 

Демо:

>>> first = [0,1,2,3,4,5] 
>>> second = [4,5,6,7,9] 
>>> sorted(set(first + second)) 
[0, 1, 2, 3, 4, 5, 6, 7, 9] 

Если вопросов первоначальный заказ:

>>> first = [0,1,2,3,4,5] 
>>> seen = set(first) 
>>> first += [x for x in second if x not in seen and not seen.add(x)] 
>>> first 
[0, 1, 2, 3, 4, 5, 6, 7, 9] 

Для больших списков множество подход будет эффективным в качестве комплектов предусмотрено O(1), для крошечных списков ваш подход тоже в порядке.

+0

Альтернативой '+' 'спискам является использование 'set(). Union (first, second)' –

+0

@JonClements Хорошая идея, это лучше. –

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