元组部分匹配

Pao*_*olo 2 python algorithm tuples matching

我有元组和元组的元组.我有兴趣知道第一个元组的哪些元素与第二元组匹配(如果有的话),也考虑了部分匹配.

这是一个过滤功能,用于演示我的意思.

def f(repo):
    pattern = (None, None, '1.3')
    for idx, item in enumerate(pattern):
        if item != None and item != repo[idx]:
            return False
    return True

>>> repo = (('framework', 'django', '1.3'), ('cms', 'fein', '1.3'), ('cms', 'django-cms', '2.2'))
>>> filter(f, repo)
(('framework', 'django', '1.3'), ('cms', 'fein', '1.3'))
Run Code Online (Sandbox Code Playgroud)

过滤器在这种形式下是无用的,因为模式不能作为参数在外部提供(我想使用相同的函数来检查不同的输入).有没有办法来解决这个问题?

而且,为了更好地解决原始问题,还有什么可以成为另一种算法呢?

zee*_*kay 7

你为什么不使用内置的filter:

>>> filter(lambda x: x[2] == '1.3', repo)
<<< (('framework', 'django', '1.3'), ('cms', 'fein', '1.3'))
Run Code Online (Sandbox Code Playgroud)

......或列表理解:

>>> [x for x in repo if x[2] == '1.3']
<<< [('framework', 'django', '1.3'), ('cms', 'fein', '1.3')]
Run Code Online (Sandbox Code Playgroud)

如果你想将它包装成一个函数:

types = {'desc': 0, 'name': 1, 'version': 2}
def repo_filter(type, critera, repo=repo, types=types):
    return [x for x in repo if x[types[type]] == critera]

>>> repo_filter('version', '1.3')
<<< [('framework', 'django', '1.3'), ('cms', 'fein', '1.3')]
Run Code Online (Sandbox Code Playgroud)