![](/img/trans.png)
[英]What is a pythonic of finding the indices of the first value in a multi-dimensional list that matches the value I'm looking for?
[英]Finding matches in a Python multi-dimensional list
我在這里瘋了,我有最后期限。 所以我在python中有這個多維列表:
list_a = [[['a', 'b'],['c', 'd'], ['e', 'CB'], ['g', 'h'], ['a', 'j', 'k']]]
注意,整個內容放在兩個括號中。 我需要比較這樣的元素: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時,我需要用它來通知我。 如果循環正確,這將很容易。 哦,我猜那邊的“嘗試”可以刪除。 我敢肯定這很容易,但是我現在無法弄清楚。
您可以使用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
你寫了
for o in range (0, len(list_a[i])):
for t in range(1, len(list_a[j])):
當o為0時t的range(1,...)
是正確的。但是當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)
此代碼是否符合您的目標?
>>> 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.