比较两个列表中同一个p的相同条目

2024-06-16 10:48:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图比较同一索引中同一元素的两个列表。其思想是验证两个列表是否在同一索引中包含相同的元素。如果是的话,我想统计一下这样的事件。这是我的密码:

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

希望有道理。谢谢


Tags: in元素密码列表forcount事件思想
3条回答

使用min()函数的短解(获得比较序列的极限大小):

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

print(count)

输出:

1

在这种情况下,您应该不使用嵌套循环(因为这意味着您将对a中的每一行在b上重复搜索);而使用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])。你知道吗

匹配是否必须限定为如下'*|*'?你知道吗

如果不是,那么真正简单的是:

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

或者在python的更高版本中,迭代器参数会自动解包:

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

相关问题 更多 >