将每个列表元素与可变数量的列表中的每个其他匹配元素进行比较

时间:2017-01-02 14:01:25

标签: python

我想以下面的方式比较python中的列表。

例如,如果我有3个列表:

l1 = [t1, t2, t3] 
l2 = [t1, t2, t3] 
l3 = [t1, t2, t3]

我想比较(列表名称 - 元素名称):

l1 - t1 with l2 - t1 
l1 - t1 with l3 - t1 
l2 - t1 with l3 - t1 

l1 - t2 with l2 - t2 
l1 - t2 with l3 - t2 
l2 - t2 with l3 - t2 

l1 - t3 with l2 - t3 
l1 - t3 with l3 - t3 
l2 - t3 with l3 - t3 

所以我想将每个列表元素与其他列表中的每个其他匹配元素进行比较,但只需要一次。列表数量可以按变量。 是否有一些优雅的方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

Itertools中的功能组合在这里很有帮助。例如(假设所有列表都具有相同的大小);

import itertools

l1 = ['l1-t1', 'l1-t2', 'l1-t3'] 
l2 = ['l2-t1', 'l2-t2', 'l2-t3'] 
l3 = ['l3-t1', 'l3-t2', 'l3-t3']

for i in range(0, len(l1)):

  comp=[l1[i],l2[i],l3[i]]

  c = itertools.combinations(comp,2)

  print c.next()
  print c.next()
  print c.next()
  print "------" 

这可以根据需要为您提供全套组合;

('l1-t1', 'l2-t1')
('l1-t1', 'l3-t1')
('l2-t1', 'l3-t1')
------
('l1-t2', 'l2-t2')
('l1-t2', 'l3-t2')
('l2-t2', 'l3-t2')
------
('l1-t3', 'l2-t3')
('l1-t3', 'l3-t3')
('l2-t3', 'l3-t3')
------

您可以添加整数值而不是字符串,并进一步与它们进行比较。

答案 1 :(得分:0)

#for every object in objects list (except the last one)...      
for i in range(objects_length-1):
    # compare it with every next object from the objects list
    for j in range(i+1, objects_length):
        logger.log_debug("\nComparing {0} and {1}..".format(self.objects[i].id, self.objects[j].id))
            # for every list (attribute of an object) element 
            for k in range(objects_list_len):
                #compare it with every list element of the next object and check if they match
                for z in range(objects_list_len):
                   #check if lists elements match ex. objects[i].list[k].id == objects[j].list[z].id