2012-06-08 1 views
0

Я пытаюсь найти дубликаты в отношениях и опустить их из своего списка. Я пробовал вложенные операторы if, но я еще не получил правильное решение.сравнение похожих товаров вложенных в список и их удаление

list = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0] ] 

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

newlist = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2] ] 

, каким образом можно я сравниваю [u'polySurface5.e [4] ', u'polySurface5.e [1]', .5] с [u'polySurface5.e [1] ', u'polySurface5.e [4]', .5 ] и удалить любое возникновение после первого?

большое спасибо!

ответ

2
my_list = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0] ] 

new_list = [] 
my_set = set() 
for sublist in my_list: 
    if sublist[2] != 0: 
     frozen_sub = frozenset(sublist) 
     if not frozen_sub in my_set: 
      new_list.append(sublist) 
      my_set.add(frozen_sub) 

Результат:

>>> new_list 
[[u'polySurface5.e[4]', u'polySurface5.e[1]', 0.5], [u'polySurface5.e[8]', u'polySurface5.e[2]', 0.9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2]] 

Обратите внимание, что я изменил название исходного списка list в my_list. Я сделал это, потому что list - это ключевое слово в Python, но, вызвав objectlist, вы затеняете его. Проверьте это:

>>> list((1,2,3)) 
[1, 2, 3] 
>>> list = [3,4,5] 
>>> list((6,7,8)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'list' object is not callable 

Редактировать: Ответить на комментарий к сообщению.

set - это структура данных, которая содержит только уникальные элементы, а элементы не имеют порядка. Например:

>>> set([1,2,2,4,4]) 
set([1, 2, 4]) 
>>> set([1,2,4]) == set([4,4,4,1,2]) 
True 

frozenset это структура данных, аналогична установить, но это другое. set изменен, а frozenset - нет; то есть мы можем добавить вещи к набору, но не к frozenset. Однако frozenset является хешируемой, а set - нет. То есть fozenset может быть ключом в словаре или элементом в наборе.

Изменчивость:

>>> b = set([1,2,3]) 
>>> b.add(6) 
>>> b 
set([1, 2, 3, 6]) 
>>> d = frozenset([1,2,3]) 
>>> d.add(6) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'frozenset' object has no attribute 'add' 

Hashability:

>>> b = set([1,2]) 
>>> d = set([5,3]) 
>>> g = set([b,d]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'set' 
>>> b = frozenset([1,2]) 
>>> d = frozenset([5,3]) 
>>> g = set([b,d]) 
>>> g 
set([frozenset([1, 2]), frozenset([3, 5])]) 

Я надеюсь, что это помогает.

+0

спасибо! работает точно так, как мне нужно. Я пытаюсь следовать логике Я понимаю подсписок, удаляя значения, которые имеют 0, а затем тестирование для членства. что такое функция my_set? – dimitarsp

+0

+1 Ницца. Очень хорошее объяснение. – mhawke

0
l = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0]] 
# remove [...,0] 
l = filter(lambda i: i[-1] != 0, l) 
# sort keys (1st and 2nd field) 
l = [sorted(i[:-1]) + i[-1:] for i in l] 
# uniques 
add_if_unique = lambda res, x: (res + [x]) if x not in res else res 
l = reduce(add_if_unique, l, []) 
+0

Это не дает требуемого результата. – mhawke

+0

@mhawke, я забыл отсортировать ключи. Исправлена. – astynax

0

Как об этом однострочном?

l = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], 
    [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], 
    [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], 
    [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], 
    [u'polySurface5.e[2]', u'polySurface5.e[2]', 0]] 

newlist = [list(member) for member in set([tuple(sorted(x[:-1]) + x[-1:]) for x in l if x[-1] != 0])] 

print newlist 
[[u'polySurface5.e[1]', u'polySurface5.e[4]', 0.5], [u'polySurface5.e[2]', u'polySurface5.e[8]', 0.9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2]] 
Смежные вопросы