Python循环遍历列表中的特定元素

时间:2015-07-16 13:01:59

标签: python for-loop

我有以下方式的两个列表,我试图以某种特定的方式比较它们:

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的第一个元素进行比较后,每个ib进行比较,而不是与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中实现这样的事情吗?欢迎所有的想法和提示。

4 个答案:

答案 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

注意:我必须将每个子列表转换为元组,因为列表不可清除,因此不能在一个集合中。

相关问题