如何正确迭代交叉点

时间:2012-10-09 14:29:07

标签: python loops set-intersection

我正在尝试迭代一系列交叉点,其中每次迭代都是一组新行的交集。我的代码看起来有点像:

    for liness in range(len(NNCatelogue)):
        for iii in [iii for iii, y in enumerate(NNCatelogue[iii]) if y in set(NNCatelogue[liness]).intersection(catid)]:
            print iii, y

NNCatelogue本质上是一个1268 X 12矩阵,每个新的liness迭代都会调用一个新行。如果我只是输入我想要的行号(即:0,1,2 ......),那么我得到预期的输出(前面没有for循环)。上面写的代码给出了以下输出:

    10 C-18-1064
    4 C-18-1122
    4 C-18-1122
    5 C-18-1122
    5 C-18-1122
    7 C-18-1122
    8 C-18-1122
    9 C-18-1122
    10 C-18-1122
    11 C-18-1122
    6 C-18-1122
    ...

预期输出应为:

  0 C-18-1
  1 C-18-259
  2 C-18-303
  3 C-18-304
  4 C-18-309
  5 C-18-324
  6 C-18-335
  7 C-18-351
  8 C-18-372
  9 C-18-373
  10 C-18-518
  11 C-18-8

知道我可能会出错吗?非常感谢任何帮助!

更新:

我尝试了其中一个答案的变体,虽然它更接近我所期待的,但它并不完全存在。这是我试过的:

    counter = 0
    for row in NNCatelogue:
        for value in row:
            if value in set(NNCatelogue[counter]).intersection(catid):
                print counter, value
                counter += 1

结果输出为:

    0 C-18-1
    1 C-18-324
    2 C-18-351
    3 C-18-4
    4 C-18-5
    5 C-18-6
    6 C-18-7
    7 C-18-8
    8 C-18-9
    9 C-18-10
    10 C-18-11
    11 C-18-12
    12 C-18-13
    ...

所以有些交叉点是正确的,虽然这不是我想要的输出......来自这里的任何想法?

3 个答案:

答案 0 :(得分:5)

您经常使用iii。我甚至无法想象如果你执行这段代码会发生什么。只需给你的变量提供有用的说话名称,你的问题就可能解决了。

答案 1 :(得分:1)

据我所知,你需要:

counter = 0
for row in NNCatelogue:
    for value in row:
        if value in catid:
            print counter, value
            counter += 1

答案 2 :(得分:0)

似乎交叉点提供了非数字排序......你得到了正确的排序(只是错误的排列)吗?