Python 如何在两个等长的排序列表中找到重复项的第一个实例的位置
我有两个相同长度的随机列表,范围从0到99Python 如何在两个等长的排序列表中找到重复项的第一个实例的位置,python,list,Python,List,我有两个相同长度的随机列表,范围从0到99 lista = [12,34,45,56,66,80,89,90] listb = [13,30,56,59,72,77,80,85] 我需要找到重复号码的第一个实例,以及它来自哪个列表。 在本例中,我需要在列表B中找到数字“56”,并获得索引I=2 谢谢 更新: 在运行了几次之后,我得到了以下错误: if list_a[i] == list_b[j]: IndexError: list index out of range 就像@Ast
lista = [12,34,45,56,66,80,89,90]
listb = [13,30,56,59,72,77,80,85]
我需要找到重复号码的第一个实例,以及它来自哪个列表。
在本例中,我需要在列表B中找到数字“56”,并获得索引I=2
谢谢
更新:
在运行了几次之后,我得到了以下错误:
if list_a[i] == list_b[j]:
IndexError: list index out of range
就像@Asterisk建议的那样,我的两个列表长度相等且已排序,i和j在开始时都设置为0。
该位是遗传交叉代码的一部分:
def crossover(r1,r2):
i=random.randint(1,len(domain)-1) # Indices not at edges of domain
if set(r1) & set(r2) == set([]): # If lists are different, splice at random
return r1[0:i]+r2[i:]
else: # Lists have duplicates
# Duplicates At Edges
if r1[0] == r2[0]: # If [0] is double, retain r1
return r1[:1]+r2[1:]
if r1[-1] == r2[-1]: # If [-1] is double, retain r2
return r1[:-1]+r2[-1:]
# Duplicates In Middle
else: # Splice at first duplicate point
i1, i2 = 0, 0
index = ()
while i1 < len(r1):
if r1[i1] == r2[i2]:
if i1 < i2:
index = (i1, r1, r2)
else:
index = (i2, r2, r1)
break
elif r1[i1] < r2[i2]:
i1 += 1
else:
i2 += 1
# Return A Splice In Relation To What List It Appeared First
# Eliminates Further Duplicates In Original Lists
return index[2][:index[0]+1]+index[1][index[0]+1:]
def交叉(r1、r2):
i=random.randint(1,len(域)-1)#索引不在域的边缘
如果集合(r1)和集合(r2)=集合([]):#如果列表不同,则随机拼接
返回r1[0:i]+r2[i:]
其他:#列表有重复项
#边缘重复
如果r1[0]==r2[0]:#如果[0]是双精度的,则保留r1
返回r1[:1]+r2[1:]
如果r1[-1]==r2[-1]:#如果[-1]是双精度的,则保留r2
返回r1[:-1]+r2[-1:]
#中间重复
否则:#在第一个重复点拼接
i1,i2=0,0
索引=()
当i1
该函数接受2个列表并返回一个。
域是10个元组的列表:(0,99)
正如我所说的,错误不是每次都会发生,只是偶尔发生一次
非常感谢您的帮助。我不是python高手,但这是一个算法问题 在每个列表中维护一个索引,并查看这两个列表位置的元素 无论哪个列表在当前位置具有最小的元素,都将移动到该列表中的下一个元素 当您发现一个元素与另一个列表的当前元素相同时,它是您的最小副本
如果到达任一列表的末尾,则不存在重复项。如果要查找所有重复项,可以使用以下方法:
list_a = [12,34,45,56,66,80,89,90]
list_b = [13,30,56,59,72,77,80,85]
set_a = set(list_a)
set_b = set(list_b)
duplicates = set_a.intersection(set_b)
# or just this:
# duplicates = [n for n in list_a if n in list_b]
for duplicate in duplicates:
print list_a.index(duplicate)
要获取任一列表中副本的最小索引,请执行以下操作:
a_min = min(map(list_a.index, duplicates))
b_min = min(map(list_b.index, duplicates))
if a_min < b_min:
print 'a', a_min, list_a[a_min]
else:
print 'b', b_min, list_b[b_min]
lista=[12,34,45,56,66,80,89,90]
listb=[13,30,56,59,72,77,80,85]
i、 j=0,0
而我>>
2 [13, 30, 56, 59, 72, 77, 80, 85]
假设:两个列表具有相同的长度,并且它们被排序只需扫描位置0、1、2处的所有列表。。。跟踪您所看到的内容(您可以在O(1)时间内查询集合) 演示:
(还没有推广到N个列表…需要稍微调整才能使用
defaultdict(set)
,将所有索引作为元组插入到一起,然后检查重复项。)您说的是“随机”,但您的示例已排序。哪个是正确的?我认为这意味着列表是随机生成然后排序的。列表中的数字是随机生成的,范围是0到99。我已经提前把它们分类了。编辑:paddy,是的。对不起,我不理解你的评论。这段代码看起来像是用python编写的javascript。一种更具python风格的方法是像Blender一样使用set(),这有利于处理不同长度的列表。
duplicate = None
for n in set_a:
if n in set_b:
duplicate = n
break
if duplicate is not None:
print list_a.index(duplicate)
lista = [12,34,45,56,66,80,89,90]
listb = [13,30,56,59,72,77,80,85]
i, j = 0, 0
while i < len(lista):
if lista[i] == listb[j]:
if i < j:
print i, lista
else:
print j, listb
break
elif lista[i] < listb[j]:
i += 1
else:
j += 1
>>>
2 [13, 30, 56, 59, 72, 77, 80, 85]
def firstDuplicate(*lists):
seen = {}
for i,tup in enumerate(zip(*lists)):
for listNum,value in enumerate(tup):
position = (listNum,i)
if value in seen:
return value, [seen[value], position]
else:
seen[value] = position
>>> value,positions = firstDuplicate(lista,listb)
>>> value
56
>>> positions
[(1, 2), (0, 3)]