2017-02-03 56 views
1

我想比较两个列表中相同的索引相同的元素。这个想法是验证两个列表是否在同一个索引处包含相同的元素。如果是的话,我想统计这种情况。这是我的代码:比较两个列表中相同的条目在相同的地方

count = 0 
a = ['.ps2\n >|<4 *|*.ps2xml', '.c\n >|<2 *|*.wsc', '.h\n >|<2 *|*.wsh', '.c\n >|<2 *|*.chm', '.h\n >|<2 *|*.hta' ] 
b = ['.ps2xml', '.chm', '.hta'] 

for x in a: 
    for y in b: 
    if y==x[x.index(" *|*")+4:]: 
    print "match" 
    count += 1 

print count 

这给了我一个数3.我期望的是1,因为只有b的第一个元素与第一个元素匹配。这两个列表的第二个元素不同。第三个要素也不同。 b中的其余元素不应该计算在内,因为在b中没有这样的索引。

希望它是有道理的。由于

+1

这里的匹配模式究竟是什么? – ospahiu

+1

如何a [0] == b [0]'? –

+1

@MoinuddinQuadri:如果我理解正确,op使用一种“特殊”方式通过首先找到一个模式('“* | *”')进行匹配,并查看它是否跟随查询。 –

回答

2

在这种情况下,你应该不使用嵌套循环(因为这意味着你将重复搜索超过ba每一行); 但使用zip(..)

for x,y in zip(a,b): 
    if y==x[x.index(" *|*")+4:]: 
     print "match" 
     count += 1 

print count 

zip需要一些迭代器和生成的元组。可以这么说,因此在这种情况下第012元组因此是(a[i],b[i])

+0

谢谢。我不知道邮编。将阅读更多。 – user2061944

1
使用 min()函数( 得到比较的序列的极限尺寸)

短溶液:

for i in range(min([len(a), len(b)])): 
    if (a[i][a[i].index('*|*') + 3:] == b[i]): 
     count += 1 

print(count) 

输出:

1 
1

不匹配必须被限定为以下'*|*'

如果没有,那么很简单就是:

sum([1 for e, f in zip(a, b) if f in e]) 

或蟒蛇的后续版本,其中迭代ARG游戏自动解压缩:

sum(f in e for e, f in zip(a, b)) # relies on bools True, False = ints 1, 0 

如果比赛只是最后一点,你可能分裂

'.ps2\n >|<4 *|*.ps2xml'.split(" *|*") 
Out[13]: ['.ps2\n >|<4', '.ps2xml'] 

'.ps2\n >|<4 *|*.ps2xml'.split(" *|*")[1] 
Out[14]: '.ps2xml' 

sum([1 for e, f in zip(a, b) if f in e.split(" *|*")[1]]) 

虽然sum()更“有意”len()可用于速度优势,因为它不必遍历列表