2011-03-22 21 views
2

我在這裏堅持這一點,我有一個截止日期。所以,我在此蟒多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 "" 

導致它自己的項目進行比較,確認自己的項目這一次失敗。當然,有一種更好的方法可以做到這一點,而不是在對方內部放置大量的forloops。

而且,我需要它在遇到CB時發信號給我。如果它合適,這將很容易。哦,那裏的「嘗試」可以刪除我猜。我相信這很容易,但我現在無法弄清楚。

+0

我沒有看到任何可以被描述爲比較的東西。你想達到什麼目的?另外,儘管您注意到列表的雙重嵌套,但您沒有解釋爲什麼會出現這種情況。 – 2011-03-22 09:41:12

+0

那麼比較部分就是在那裏添加一條if語句,這很容易。現在我只是將它們全部打印出來,看看當前選擇了哪些元素。 – test 2011-03-22 09:43:34

+0

Rmitteleitav Python中唯一的數組是這些:(http://docs.python.org/library/array.html#array.array)事實上,你所謂的數組就是列表。 – eyquem 2011-03-22 12:05:11

回答

5

您可以使用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

這是爲我做的。我有一個線索,它必須用迭代器完成。不管怎樣,謝謝。 – test 2011-03-22 15:04:06

0

你寫

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

range(1,...)對於t是正確的當爲0。但是,當Ø是1,2,3,...,然後牛逼必須在range(o+1,...):但只有當i==j

我認爲只有一個元素[「一」的,「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) 

此代碼與您的目的對應嗎?

0
>>> 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