如何在python中使用itertools仅打印最后一个匹配项?

时间:2019-05-28 17:34:34

标签: python itertools

我有以下代码:

const projectsPage = require('../../lib/pages/projects.page');
const by = require('selenium-webdriver').By;

describe('Projects page', () => {
  it('Search google', async() => {
    await projectsPage.navigateTo();
    const title = await driver.getTitle();
    expect(title).toBe('Google');
    const q = await driver.findElement(by.name('q'));
    await q.sendKeys('test');
  })
});

它打印:

p = ['a','b','c','d']
q = ['a','a','x','y','z']

for (p, q) in itertools.product(p, q):
    if p == q:
        print(q)

添加了一些其他日志后,似乎a a 的第一项与p的第一项进行了比较,然后将q的第一项与{{1}的第二项进行了比较},p的第一项和q的第三项,等等。

如何修改此代码,使其仅显示最后一个匹配项?因此,我只希望输出p一次(因为在这种情况下,q的第一项与a中的第二项比较)

3 个答案:

答案 0 :(得分:1)

为什么不简单地使用集合来查找两个列表之间的公共字符

p = ['a','b','c','d']
q = ['a','a','x','y','z']

print(set(p).intersection(set(q)))

输出将为{'a'}

或者,如果您不能使用集合,则将所有匹配项收集到列表中并打印最后一个元素

import itertools

p = ['a','b','c','d']
q = ['a','a','x','y','z']

items = []
for (p, q) in itertools.product(p, q):
    #Collect all matches in a list
    if p == q:
        items.append((p,q))

#Print the last item
print(items[-1])

输出将为('a', 'a')

答案 1 :(得分:1)

如果由于pq太大而导致无法负担得起它们,则可以将已经匹配的值添加到集合中并检查是否包含:

p = ['a','b','c','d']
q = ['a','a','x','y','z']
seen = set([])

for a, b in itertools.product(p, q):
    if a == b and b not in seen:
        print(b)
        seen.add(b)

答案 2 :(得分:-1)

为此,我只需要反转两个list即可:

import itertools
p = ['a','b','c','d']
q = ['a','a','x','y','z']

for (x, y) in itertools.product(p[::-1], q[::-1]):
    if x == y:
        print(y)
        break

输出:

a