Поиск совпадений в многомерном списке Python - PullRequest
2 голосов
/ 22 марта 2011

Я схожу с ума здесь с этим, и у меня есть крайний срок.Итак, у меня есть этот список multi-d в 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 ""

Этот код не работает, потому что он сравнивает свои собственные элементы с собственными.Конечно, есть лучший способ сделать это, вместо того, чтобы помещать много циклов внутри друг друга.

А также, мне нужно, чтобы он сигнализировал мне, когда он сталкивается с CB.Это было бы легко, если бы это было правильно.О, и эта «попытка» там может быть удалена, я думаю.Я уверен, что это легко, как пирог, но я просто не могу понять это прямо сейчас.

Ответы [ 3 ]

5 голосов
/ 22 марта 2011

Вы можете использовать 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
0 голосов
/ 22 марта 2011
>>> 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
0 голосов
/ 22 марта 2011

Вы написали

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

Значение range(1,...) для t верно, когда 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)

Соответствует ли этот код вашей цели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...