在少数列表中查找重复项

时间:2014-11-23 00:48:49

标签: python list position duplicates nested-loops

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

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]。因为在list1中重复了3次,所以在list2' b'在列表3' T3'中重复与list1中相同的位置。在第二种情况5中,e,T5表示其列表中相同位置的重复项目。我很难自动呈现结果"#34;一步到位

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(找到的副本的位置放在列表中),我想自动执行此步骤,以便在列表中的相同位置具有重复元素的位置。对于所有重复的同时,而不是一个一个" manualy"。我认为它只需要一个for循环或if,但我是Python的新手,我尝试了很多组合而且它没有用。

1 个答案:

答案 0 :(得分:2)

您可以使用与键相同的索引上的所有3个列表中的项目,并将相应的索引存储为值(在列表中)。如果对于任何键,列表中存储了多个索引,则它是重复的:

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]