2014-11-23 63 views
1

在我的情况下,重复项目不是重现在一个列表中的项目,而是在另一个列表中的相同位置中。例如:在少数列表中查找重复项目

list1 = [1,2,3,3,3,4,5,5] 
list2 = ['a','b','b','c','b','d','e','e'] 
list3 = ['T1','T2','T3','T4','T3','T4','T5','T5'] 

因此,所有3个列表中真正重复的位置是[2,4]和[6,7]。因为在列表1中重复3,所以在列表2中'b'在与列表1相同的位置重复,列表3'T3'中。在第二种情况5中,e,T5表示其列表中相同位置的重复项目。我很难在一步中“自动”呈现结果。

1)我发现第一个列表

# Find Duplicated part numbers (exact maches) 
def list_duplicates(seq): 
    seen = set() 
    seen_add = seen.add 
    # adds all elements it doesn't know yet to seen and all other to seen_twice 
    seen_twice = set(x for x in seq if x in seen or seen_add(x)) 
    # turn the set into a list (as requested) 
    return list(seen_twice) 
# List of Duplicated part numbers 
D_list1 = list_duplicates(list1) 
D_list2 = list_duplicates(list2) 

2副本)然后我发现给出重复的位置,并期待在该位置在第二列表

# find the row position of duplicated part numbers 
def list_position_duplicates(list1,n,D_list1): 
    position = []  
    gen = (i for i,x in enumerate(data) if x == D_list1[n]) 
    for i in gen: position.append(i) 
    return position  

# Actual calculation find the row position of duplicated part numbers, beginning and end 
lpd_part = list_position_duplicates(list1,1,D_list1) 
start = lpd_part[0] 
end = lpd_part[-1] 

lpd_parent = list_position_duplicates(list2[start:end+1],0,D_list2) 

所以在步骤2中,我需要把n(在列表中找到重复的位置),我想自动执行此步骤,以在列表中的相同位置具有重复元素的位置。对于同一时间的所有重复,而不是一个一个“手动”。我认为它只是需要一个for循环或如果,但我是Python的新手,我尝试了很多组合,并没有奏效。

回答

2

您可以使用同一个索引中所有3个列表中的项作为键,并将相应的索引作为值存储在列表中。如果对于任何键存储在列表中的索引超过1个,则它是重复的:

from itertools import izip 

def solve(*lists): 
    d = {} 
    for i, k in enumerate(izip(*lists)): 
    d.setdefault(k, []).append(i) 
    for k, v in d.items(): 
    if len(v) > 1: 
     print k, v 

solve(list1, list2, list3) 
#(3, 'b', 'T3') [2, 4] 
#(5, 'e', 'T5') [6, 7]