如果我们有一个元组列表:
[(0,1),(1,2),(5,5),(4,1)]
如何查找与搜索字词部分匹配的所有项目?
例如,在上面的示例中,(_, 1)
应与(0, 1)
和(4, 1)
匹配。
答案 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]