【问题标题】:Finding matches in a Python multi-dimensional list在 Python 多维列表中查找匹配项
【发布时间】:2011-03-22 09:33:40
【问题描述】:

我在这里发疯了,我有一个截止日期。所以我在 python 中有这个多维列表:

list_a = [[['a', 'b'],['c', 'd'], ['e', 'CB'], ['g', 'h'], ['a', 'j', 'k']]]

请注意,整个内容都在 2 个括号中。 我需要比较这样的元素:a 到 c、a 到 d、b 到 c、b 到 d、a 到 e、a 到 CB...直到第一个列表将它的所有项目与另一个列表中的所有项目进行比较列表,然后它移动到第二个列表并开始将其项目与其余列表进行比较,依此类推直到最后。我不希望它将自己的项目与自己的列表进行比较。 这是一些代码:

for i in range(0, len(list_a)):
  for j in range(0, len(list_a)):
    for o in range (0, len(list_a[i])):
        for t in range(1, len(list_a[j])):
            try:
                for x in range(0, len(list_a[i][o])):
                    for y in range(0, len(list_a[j][t])):
                        print list_a[i][o][x], "i=",i, "o=",o, "x=",x
                        print list_a[j][t][y], "j=",j, "t=",t, "y=",y
            except IndexError:
                print ""

这个失败是因为它将自己的项目与自己的项目进行比较。当然有更好的方法来做到这一点,而不是在彼此之间放置大量的 forloop。

而且,当它遇到 CB 时,我需要它向我发出信号。如果它循环正确,这将很容易。哦,我猜那里的“尝试”可以删除。我敢肯定这很容易,但我现在想不通。

【问题讨论】:

  • 我没有看到任何可以被描述为比较的东西。你想达到什么目的?此外,尽管您注意到列表的双重嵌套,但您没有解释为什么会这样。
  • 嗯,比较部分是在某处添加一个 if 语句,这很容易。现在我只是将它们全部打印出来,看看当前选择了哪些元素。
  • Rmitteleitav Python 中唯一的数组是这些:(docs.python.org/library/array.html#array.array) 你所说的数组实际上是列表。

标签: python multidimensional-array


【解决方案1】:

您可以使用 itertools 从列表中获取所有对,然后找到它们的所有产品:

import itertools
for l1, l2 in itertools.combinations(list_a[0], 2):
    for e1, e2 in itertools.product(l1, l2):
        print e1, e2

打印:

a c
a d
b c
b d
a e
a CB
b e
b CB
a g
a h
b g
b h
a a
a j
a k
b a
b j
b k
c e
c CB
d e
d CB
c g
c h
d g
d h
c a
c j
c k
d a
d j
d k
e g
e h
CB g
CB h
e a
e j
e k
CB a
CB j
CB k
g a
g j
g k
h a
h j
h k

【讨论】:

  • 这个是为我做的。我有一个线索,它必须用迭代器来完成。无论如何,谢谢。
【解决方案2】:

你写的

for o in range (0, len(list_a[i])):
     for t in range(1, len(list_a[j])):

trange(1,...)o 为 0 时是正确的。但是当 o 为 1,2,3... 时t 必须在 range(o+1,...): 中,但前提是 i==j

我认为您的示例中只有一个元素 [['a', 'b'],...['a', 'j', 'k']] 来限制执行和显示的时间,并且我想实际上还有其他元素。所以我用第二个列表作为元素进行了测试,假设你想做什么样的比较。所以,我观察了索引的一些问题,你会在下面的代码中看到采用的解决方案。

我还更改了显示,以便更轻松地分析过程。请注意“技巧”包含在列表 ecr 中的渐进式附加并在末尾显示此列表的内容。因此,显示是瞬时的,而不是逐行显示。

list_a = [[['a', 'b'],['c', 'd'], ['e', 'CB'], ['g', 'h'], ['a', 'j', 'k']],
          [['l', 'm'],['b', 'n'], ['q', 'r'], ['CB', 'c', 'n']]]


ecr = []
for i in xrange(0, len(list_a)):
    for j in xrange(i, len(list_a)):
        ecr.append('XXXXXXXXXXXXXXXXXXX i,j='+str(i)+','+str(j))
        for o in xrange (0, len(list_a[i])-(1 if i==j else 0)):
            ecr.append('================= o='+str(o)+'  < '+str(len(list_a[i])-(1 if i==j else 0)))
            for t in xrange(o+1 if i==j else 0, len(list_a[j])):
                ecr.append('------------- o,t='+str(o)+','+str(t))
                try:
                    for x in xrange(0, len(list_a[i][o])):
                        ecr.append('~~~~~~~ x='+str(x))
                        for y in xrange(0, len(list_a[j][t])):
                            ecr.append("i,j="+str(i)+ ","+str(j)+'\n'+\
                                       list_a[i][o][x]+ "  o="+str(o)+ "  x="+str(x)+'\n'+\
                                       list_a[j][t][y]+ "  t="+str(t)+ "  y="+str(y)+'\n'+\
                                         ' ')
                except IndexError:
                    ecr.append( "FAIL")


print '\n'.join(ecr)

这段代码符合你的目标吗?

【讨论】:

    【解决方案3】:
    >>> list_a = [[['a', 'b'], ['c', 'd'], ['e', 'CB'], ['g', 'h'], ['a', 'j', 'k']]]
    
    >>> k = list_a[0]
    
    >>> c = [(a,b) for b in k for a in k if a!=b] # cartesian excluding self==self
    
    >>> u = [(d,b) for a,b in c for d in a] # unique key, list of values
    
    >>> f = [(a,d) for a,b in u for d in b] # final results (key,value)
    
    >>> print "\n".join(sorted(["%s %s" % x for x in f]))
    CB a
    CB a
    CB b
    CB c
    CB d
    CB g
    CB h
    CB j
    CB k
    a CB
    a CB
    a a
    a a
    a b
    a c
    a c
    a d
    a d
    a e
    a e
    a g
    a g
    a h
    a h
    a j
    a k
    b CB
    b a
    b c
    b d
    b e
    b g
    b h
    b j
    b k
    c CB
    c a
    c a
    c b
    c e
    c g
    c h
    c j
    c k
    d CB
    d a
    d a
    d b
    d e
    d g
    d h
    d j
    d k
    e a
    e a
    e b
    e c
    e d
    e g
    e h
    e j
    e k
    g CB
    g a
    g a
    g b
    g c
    g d
    g e
    g j
    g k
    h CB
    h a
    h a
    h b
    h c
    h d
    h e
    h j
    h k
    j CB
    j a
    j b
    j c
    j d
    j e
    j g
    j h
    k CB
    k a
    k b
    k c
    k d
    k e
    k g
    k h
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2016-03-25
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多