在元组列表中搜索部分匹配

时间:2015-04-25 14:12:59

标签: python

如果我们有一个元组列表:

[(0,1),(1,2),(5,5),(4,1)]

如何查找与搜索字词部分匹配的所有项目?

例如,在上面的示例中,(_, 1)应与(0, 1)(4, 1)匹配。

2 个答案:

答案 0 :(得分:5)

您可以使用始终与任何其他对象进行比较的特殊对象来实现通配符匹配。例如

#!/usr/bin/env python

class Any:
    def __eq__(self, other):
        return True

    def __repr__(self):
        return 'Any'

ANY = Any()

#Test
if 1:
    print ANY
    for v in [1,2,'a', 'b', (2,3,4), None]:
        print v, v == ANY
    print

def match(target, data):
    ''' Check that sequence data matches sequence target '''
    return len(data) == len(target) and all(u==v for u, v in zip(target, data))

data_list = [(0, 1), (1, 2), (5, 5), (4, 1)]
target = (ANY, 1)
print [v for v in data_list if match(target, v)]

<强>输出

Any
1 True
2 True
a True
b True
(2, 3, 4) True
None True

[(0, 1), (4, 1)]

感谢Antti Haapala,这是一个更好的版本Any类。它打印的输出与上面的代码相同。

#!/usr/bin/env python

class AnyBase(type):
    def __eq__(self, other):
        return True

    def __repr__(self):
        return 'Any'

    @classmethod
    def __subclasscheck__(cls, other):
        return True

    @classmethod
    def __instancecheck__(cls, other):
        return True

class Any(object):
    __metaclass__ = AnyBase

    def __init__(self):
        raise NotImplementedError("How'd you instantiate Any?")


#Test
if 1:
    print Any
    for v in [1,2,'a', 'b', (2,3,4), None]:
        print v, v == Any
    print

def match(target, data):
    ''' Check that sequence data matches sequence target '''
    return len(data) == len(target) and all(u==v for u, v in zip(target, data))

data_list = [(0, 1), (1, 2), (5, 5), (4, 1)]
target = (Any, 1)
print [v for v in data_list if match(target, v)]

要使用第一个版本,我们确实应该创建该类的实例,但第二个版本中的Any类旨在直接使用。此外,第二个版本显示了如何处理isinstance&amp; subclass检查;根据具体情况,您可能希望限制这些测试。

答案 1 :(得分:4)

new_list = [i for i in old_list if i[1] == 1]