在我的情况下,复制不是重新出现在一个列表中的项目,而是在另一个列表中的相同位置。例如:
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的新手,我尝试了很多组合而且它没有用。
答案 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]