我正在使用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中,加入其他值
任何建议??
谢谢 问候
我正在使用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中,加入其他值
任何建议??
谢谢 问候
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]]
我想你可以使用一个字典,如果顺序并不重要:
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
代替。
什么解决方案,你已经尝试?也许这个模块可以帮助你:http://docs.python.org/library/itertools.html?highlight=itertools#module-itertools –
上一个问题的答案也应该适用于这一个。简而言之:迭代外部列表,从内部列表中创建第一个和最后一个值的元组,然后检查该元组是否在一组可见对中。 – Blckknght
@Blckknght - 这有些不同。在这里,OP想要合并列表,所以'dict'比'set'更合适,因为dict使您可以轻松处理要合并的列表。 – mgilson