2013-06-05 4 views
1

Я использую python 2.7, и я пытаюсь найти дубликаты списков в списке списков на основе двух значений. Напримерpython найти дубликаты списков в списке списков

list= [[a,x,y,2], [b,xx,yy,2], [c,xxx,yyy,3],[a,yx,yx,2]] 

outcome [[a,xyx,yyx,2], [b,xx,yy,2], [c,xxx,yyy,3]] 

так на основании значений а и 2, присоединиться другие значения

какие-либо предложения ??

спасибо привет

+0

Какие решения вы уже пробовали? Возможно, этот модуль может вам помочь: http://docs.python.org/library/itertools.html?highlight=itertools#module-itertools –

+0

Ответы на этот предыдущий вопрос должны отлично работать и для этого. Вкратце: итерация по внешнему списку, сделайте кортеж первого и последнего значений из внутреннего списка, затем проверьте, находится ли этот кортеж в наборе видимых пар. – Blckknght

+0

@Blckknght - Это немного отличается. Здесь OP хочет объединить списки, поэтому 'dict' более подходит, чем' set', поскольку dict дает вам простой дескриптор в списке, с которым вы хотите объединиться. – mgilson

ответ

1
from collections import OrderedDict 
lis = [['a','x','y',2], ['b','xx','yy',2], ['c','xxx','yyy',3],['a','yx','yx',2]] 
dic = OrderedDict() 
for x in lis: 
    key = (x[0],x[-1]) 
    if key not in dic: 
     dic[key] = x[1:-1] 
    else: 
     val = dic[key] 
     dic[key] = [a+b for a,b in zip(val,x[1:-1])] 

print [[k[0]] + v + [k[1]] for k,v in dic.items()] 

выход:

[['a', 'xyx', 'yyx', 2], ['b', 'xx', 'yy', 2], ['c', 'xxx', 'yyy', 3]] 
2

Я полагаю, вы могли бы использовать Dict, если порядок не имеет значения:

from operator import itemgetter 
getter = itemgetter(0,-1) 

def merge(lst1,lst2): 
    return [lst1[0],lst1[1]+lst2[1],lst1[2]+lst2[2],lst1[3]] 


d = {} 
for sublist in lst: 
    t = getter(sublist) 
    if t not in d: 
     d[t] = sublist 
    else: 
     d[t] = merge(sublist,d[t]) 

print d.values() 

Если вопросам заказа, вы могли бы использовать вместо collections.OrderedDict.

+0

Это должно быть '(0, -1)' – jamylak

+2

@jamylak - вы правы. Я провел немного дольше, чем обычно, работая с Фортраном вчера днем. Видимо, я забыл переключить свой ум на обратную сторону в 0-индексацию. :) – mgilson

+1

Где вы находите fortran унаследованный продукт в 2013 году? –