我试图在同一索引处比较同一元素的两个列表。我们的想法是验证两个列表是否在同一索引中包含相同的元素。如果是,我想计算这种情况。这是我的代码:
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中没有这样的索引。
希望它有意义。谢谢
答案 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()
可用于速度优势,因为它不必遍历列表