我正在尝试让Python在我的列表中搜索包含我的两个搜索词的子列表,但是我获得了包含一个或多个搜索的子列表。这是我的代码:
search1 = 4
search2 = 3
data = [[4,3],[4,7], [6,3], [9,2]]
found = False
for sublist in data:
if search1 in sublist:
print("there", sublist)
if search2 in sublist:
print("there", sublist)
found = True
if(found==False):
print("not there")
print(data)
if(found==False):
print("not there")
print(data)
我得到的输出是:
there [4,3] #I only want this sublist, and only once.
there [4,3]
there [6,3] #I don't want this sublist.
干杯! 5813
答案 0 :(得分:2)
for sublist in data:
if search1 in sublist and search2 in sublist:
print("there", sublist)
break
您的问题是,在您的代码中,您正在搜索第一个值,然后单独搜索第二个值。您需要搜索以确保两者都在同一个子列表中,否则您将获得具有这些值之一的所有子列表。
break
语句确保子列表只打印一次。
更新
要回答你的评论,是的,它确实比上面的代码轻得多。这是:
data = [[4,3],[4,7], [6,3], [9,2]]
search = [4,3]
if search in data:
print 'yes',search
首先,您只需要一个搜索变量search
,设置为您要查找的搜索值列表。
其次,我们不再需要for循环,因为我们不再在子列表中查找单个数字,我们只是寻找item in list
。
这样做的另一个好处是,现在您可以通过列表切片,添加新搜索值或删除一些搜索变量来更新搜索变量,并维护您正在寻找的顺序。之前,您必须添加新的搜索变量并将其添加到if语句中。
答案 1 :(得分:0)
有一些更好的方法可以执行此操作(您可能希望在列表中查找排序方法的'key'参数),您发布的代码的问题位于第7行:print("there", sublist)
。您只应在两个检查通过后打印,但该行在第一次检查后和第二次检查之前。我建议删除该行,并使用and
将嵌套的if组合成单个if语句。
答案 2 :(得分:0)
您需要删除第一个'那里'打印:
for sublist in data:
if search1 in sublist:
if search2 in sublist:
print("there", sublist)
found = True
通过对问题的描述,我认为你还应该删除第一个'if(found == False):'部分,否则你最终会得到'not there'和数据的多个打印件。在这个例子中 - 4次打印(3次冗余)。
答案 3 :(得分:0)
返回匹配的数据项:
>>> data = [[4,3],[4,7], [6,3], [9,2]]
>>> search = [3, 4]
>>> [i for i in data if all(k in i for k in search)]
[[4, 3]]
顺便说一句,写“找到==错误”的惯用方法是“找不到”。