用通配符搜索元组列表?

时间:2010-12-30 01:55:48

标签: python list tuples

如果我只知道列表中任何元组的1个元素,我如何搜索元组列表?

模型示例(这不起作用):

tuplelist = [('cat', 'dog'), ('hello', 'goodbye'), ('pretty', 'ugly')]
matchlist = []
searchstring = 'goodbye'

if (*, searchstring) in tuplelist:
    print "match was found"
    matchlist.append(tuplelist[#index of match])

asterix将是我想放置通配符的地方

我知道我可以使用:

for i in range (len(tuplelist)):
    if tuplelist[i][1]==searchstring:
        matchlist.append(tuplelist[i])
        print "match was found"

但问题是如果找不到匹配项,我只需要运行一次特定的函数。

也许我可以创建一个在找到匹配时递增的计数器,并将这样的内容添加到循环中。

    if i==len(tuplelist) and matchcounter==0:
        #do something
        print "no match was found"

但是我认为这有点丑陋和令人困惑,我确信有一些更清洁的方法可以做到这一点:P

6 个答案:

答案 0 :(得分:5)

我很惊讶没有人真正指出这一点,这是一个相当陈旧的问题,但我会留在这里以防万一有人像我一样偶然发现这一点。

Python中有一个for ... else构造,仅用于此用例。你可以这样做(我将使用Mark Byers的代码并进行更改):

for t in tuplelist:
    if t[1] == searchstring:
        #do something
        print "match was found"
        break
else:
    print "not matches found"
    # call function if not matches were found.

只有当循环正常退出(没有中断)时才会发生else部分。

答案 1 :(得分:4)

你可以这样做:

found_match = False

for t in tuplelist:
    if t[1] == searchstring:
        #do something
        print "match was found"
        found_match = True

if not found_match:
    # ...

答案 2 :(得分:3)

您可以使用列表推导来生成仅包含您关注的元素的新列表。例如:

tuplelist = [('cat', 'dog'), ('hello', 'goodbye'), ('pretty', 'ugly')]
if 'goodbye' in (x[1] for x in tuplelist):
    print "match was found"

这将获取元组列表并构造列表(实际上是一个生成器表达式),其中只包含每个元组的第二个元素;然后它测试搜索字符串以查找该新列表中的成员资格。

答案 3 :(得分:3)

认为你正在尝试进行部分有序匹配; 以下使用None作为通配符:

def tupleMatch(a,b):
    return len(a)==len(b) and all(i is None or j is None or i==j for i,j in zip(a,b))

def tupleCombine(a,b):
    return tuple([i is None and j or i for i,j in zip(a,b)])

def tupleSearch(findme, haystack):
    return [tupleCombine(findme,h) for h in haystack if tupleMatch(findme, h)]

findme = (None, "goodbye")
haystack = [
    ('cat', 'dog'),
    ('hello', 'goodbye'),
    ('pretty', 'ugly'),
    ('tomorrow', 'goodbye'),
    ('goodbye', 'today'),
    ('anything', None)
]
tupleSearch(findme, haystack)

返回

[('hello', 'goodbye'), ('tomorrow', 'goodbye'), ('anything', 'goodbye')]

答案 4 :(得分:1)

def f(x,y): return 'did something with (%s,%s)' % (str(x), str(y))

matches = [f(a,b) for a,b in tuplelist if b == searchstring]
if not matches:
    #do something else
    pass

答案 5 :(得分:1)

pairs = [('cat', 'dog'), ('hello', 'goodbye'), ('pretty', 'ugly')]
matches = [p for p in pairs if p[1] == 'goodbye']

完成。没有大惊小怪,没有麻烦。你正在努力按照命令式语言中的方式做事。不要试图告诉Python如何做事,并告诉它该怎么做。

  

但问题是如果找不到匹配项,我只需要运行一次特定的函数。

...然后检查列表:如果它是空的,则找不到匹配项。有什么问题?