我有以下方式的两个列表,我试图以某种特定的方式比较它们:
a = [[18, 299, 559], [18, 323, 564], [18, 353, 564], [18, 391, 570], [18, 448, 570]]
b = [[18, 353, 564], [18, 299, 559], [18, 323, 564], [18, 391, 570], [18, 448, 570]]
我想要什么
我想按照以下顺序将a
的每个元素与b
进行比较。
例如,在[18, 299, 559]
的{{1}}的第一个元素a
等于[18, 299, 559]
的{{1}}之后的情况下,循环将在b
的新循环第2个元素中断开1}} ie a
将从[18, 323, 564]
[18, 323, 564]
开始进行比较。
这里的要点是新的循环不应该从b
的第一个元素开始重复迭代,同时将b
的所有元素与第0个索引的所有a
进行比较。
P.S。在这个例子中,我不是要检查两个列表中是否存在元素,或者找不到任何可以使用b
方法轻松完成的缺失元素。这个逻辑只是为了我自己的知识
我尝试了什么
所有普通的嵌套循环方法如下:
set
此处的问题是,在for i in a:
for j in b: #after break it would always start with first element in b
if i == j:
break
的第一个元素与break
的第一个元素进行比较后,每个i
新b
进行比较,而不是与a
我想到的东西看起来像这样:
for i in a:
for j in b:
if i == j:
print something
save index of j
break
in the next loop start comparing new i from this saved index of j
然而,我无法将这个想法变成代码。
我知道这听起来很荒谬,但是就循环问题而言,可以在python中实现这样的事情吗?欢迎所有的想法和提示。
答案 0 :(得分:1)
当然,你可以追踪你进入b
的距离。我会调用此变量start_j
,从那里可以开始在b
中进行比较:
a = [[18, 299, 559], [18, 323, 564], [18, 353, 564], [18, 391, 570], [18, 448, 570]]
b = [[18, 353, 564], [18, 299, 559], [18, 323, 564], [18, 391, 570], [18, 448, 570]]
start_j = 0
for i in range(len(a)):
for j in range(start_j, len(b)):
if a[i] == b[j]:
print 'match found:', i, j
start_j = j
break
如果找到了匹配元素,start_j
将设置为最新j
,下次内循环(用于检查b
中的元素)将从那里开始。
输出:
match found: 0 1
match found: 1 2
match found: 3 3
match found: 4 4
答案 1 :(得分:1)
这个怎么样:
start_idx = 0
for i in a:
for j_idx, j in enumerate(b[start_idx:], start=start_idx):
if j==a:
print 'Bingo!'
start_idx = j_idx
break
P.S范围(len(a)) - 这很丑:)
答案 2 :(得分:1)
这是如何在没有继续或喙的情况下做到这一点......
a = [[18, 299, 559], [18, 323, 564], [18, 353, 564], [18, 391, 570], [18, 448, 570]]
b = [[18, 353, 564], [18, 299, 559], [18, 323, 564], [18, 391, 570], [18, 448, 570]]
matches = []
for i in xrange(len(a)):
for j in xrange(len(b)):
if a[i] == b[j]:
matches.append([i,j])
for match in matches: print(match)
答案 3 :(得分:0)
根据您的描述:
P.S。在这个例子中,我不是要检查两个列表中是否存在元素,或者找到任何可以通过set方法轻松完成的缺失元素。这个逻辑只是为了我自己的知识
我认为您正在尝试在两个列表之间进行集合比较。为什么不将它们变成一组?
aset = set(tuple(item) for item in a)
bset = set(tuple(item) for item in b)
print 'Items only in A:', aset - bset
print 'Items only in B:', bset - aset
print 'Items in common:', aset & bset
注意:我必须将每个子列表转换为元组,因为列表不可清除,因此不能在一个集合中。