2013-03-24 3 views
0

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

Например, я хочу, чтобы заменить l с lnew:

l = ['iter1apple','iter2banana','iter3carrot','iter4apple','iter5orange','iter6banana','iter7mango'] 

lnew = ['iter1apple','iter2banana','iter3carrot','iter5orange','iter7mango'] 

Я предполагаю, что это что-то делать с расщеплением числа от остальной части элемента списка, преобразования списка для установки и использования defaultdict с элементами из раскола, но я не могу понять, как это сделать.

Любые предложения будут оценены.

+0

Так как же вы решили удалить '' iter4apple' и iter6banana'? Общее решение было бы похоже на 'lnew = [elem for elem in l if elem not in discardable]', где 'disardable' - это набор тех, которые вы хотите удалить. – hughdbrown

+0

@hughdbrown: 'discardable' не является предопределенным. Я пытаюсь определить, что является отбрасываемым на основе позиции элемента и является ли он дубликат элемента с более низким номером 'iter'. – user1185790

ответ

1

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

import re 

l = ['iter1apple', 'iter2banana', 'iter3carrot', 'iter4apple', 'iter5orange', 'iter6banana', 'iter7mango'] 
duplicates = [] 
lnew = [] 
for item in l: 
    match = re.match("^iter\d+(\w+)$", item) 
    if match and not match.group(1) in duplicates: 
     duplicates.append(match.group(1)) 
     lnew.append(item) 

# lnew = ['iter1apple','iter2banana','iter3carrot','iter5orange','iter7mango'] 
+0

Это сделало трюк! Спасибо А. Родасу! – user1185790

+0

@ user1185790 Добро пожаловать, рад, что это помогло! –

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