我有两个清单。我必须找到这些列表不同的索引。
case 1:
a = "node1 ip up ether 40 46 server low".split()
b = "node1 ip <down> ether <number(s)> server <status>".split()
output = [ [[2],[2]],
[[4,5],[4]],
[[7],[6]] ]
case 2:
a = ' label 0 12000 '.split()
b = ' label <number> <number>'.split()
output = [ [[1,2],[1,2]] ]
a,b是输入列表,输出是结果列表。
b中与a不同的元素包含在<>
中,例如。 <blabla>
在案例1和案例2中,output[i][0]
为a
提供索引,output[i][1]
为b
提供索引。
up
和<down>
在位置[2,2]
上有所不同。 40, 46
和<number(s)>
在[4,5],[4]
位置不同,等等。output[0][0] = [1,2]
对应0 12000
,output[0][1] =[1,2]
对应<number> <number>
。 答案 0 :(得分:1)
尝试
[k for k, v in enumerate(zip(a,b)) if not v[0] == v[1]]
答案 1 :(得分:1)
这给出了给定两种情况的请求输出。
import difflib
def diff_indices(a, b):
sm = difflib.SequenceMatcher(a=a, b=b)
res = []
for tag, i1, i2, j1, j2 in sm.get_opcodes():
if tag == 'replace':
res.append([range(i1,i2), range(j1,j2)])
return res
print diff_indices(
a="node1 ip up ether 40 46 server low".split(),
b="node1 ip <down> ether <number(s)> server <status>".split())
#[[[2], [2]], [[4, 5], [4]], [[7], [6]]]
print diff_indices(
a=' label 0 12000 '.split(),
b=' label <number> <number>'.split())
#[[[1, 2], [1, 2]]]
目前尚不清楚您的期望是什么?这种情况:
a = "node1 ip up ether 40 46 server low".split()
b = "node1 ip <down> ether server <status>".split()
答案 2 :(得分:0)
以下应该工作。
lista="abcd"
listb="accd"
print [ i for i in xrange(min(len(lista),len(listb))) if lista[i] != listb[i] ]
答案 3 :(得分:0)
a = "node1 ip up ether 40 46 server low".split()
b = "node1 ip <down> ether <number(s)> server <status>".split()
if len(a) > len(b):
b,a = a,b
a_it = iter(a)
b_it = iter(b)
diffs = []
a_diff = []
b_diff = []
i = 0
start = 0
while i < len(a):
j = i
while j < len(b):
if a[i] == b[j]:
if a_diff:
b_diff = range(start,j)
diffs.append([a_diff,b_diff])
a_diff = []
b_diff = []
i = i + 1
start = j + 1
j = j + 1
a_diff.append(i)
i = i + 1
if a_diff:
b_diff = range(start,j)
diffs.append([a_diff,b_diff])
print diffs