比较相同位置的相同条目的两个列表

时间:2017-02-03 17:31:38

标签: python list

我试图在同一索引处比较同一元素的两个列表。我们的想法是验证两个列表是否在同一索引中包含相同的元素。如果是,我想计算这种情况。这是我的代码:

 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的第一个元素与第一个元素相匹配。两个列表的第二个元素不同。第三个要素也不同。列表a中的其余元素不应计入,因为b中没有这样的索引。

希望它有意义。谢谢

3 个答案:

答案 0 :(得分:2)

在这种情况下,您应不使用嵌套循环(因为这意味着您将对b中的每一行重复a上的搜索; 但请使用zip(..)

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

print count

zip需要一些迭代器并生成元组。在这种情况下, i -th元组因此可以(a[i],b[i])

答案 1 :(得分: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

答案 2 :(得分:1)

匹配必须符合以下'*|*'吗?

如果不是那么真的很简单:

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

或在更高版本的python中,迭代器args会自动解压缩:

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()可用于速度优势,因为它不必遍历列表