在Python多维列表中查找匹配项
我快要疯了,因为我有个截止日期。现在我在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 ""
这段代码出错了,因为它在比较自己列表里的项。肯定有更好的方法来做到这一点,而不是把很多个循环放在一起。
另外,我需要它在遇到CB的时候提醒我。如果循环能正确执行,这会很简单。哦,还有那个“try”可以去掉,我想。 我知道这应该很简单,但我现在就是想不出来。
3 个回答
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
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。
0
你写的内容是
for o in range (0, len(list_a[i])):
for t in range(1, len(list_a[j])):
当o是0的时候,range(1,...)
中的t是正确的。但是当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)
这段代码符合你的目标吗?
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