如果我只知道列表中任何元组的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
答案 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如何做事,并告诉它该怎么做。
但问题是如果找不到匹配项,我只需要运行一次特定的函数。
...然后检查列表:如果它是空的,则找不到匹配项。有什么问题?