Python 在列表的同一子列表中搜索多个元素

Python 在列表的同一子列表中搜索多个元素,python,list,sublist,Python,List,Sublist,我试图让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:

我试图让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

有一些更好的方法(您可能希望在列表中查找排序方法的“key”参数),您发布的代码的问题在第7行:
print(“There”,sublist)
。只应在两次检查都通过后打印,但该行位于第一次检查之后第二次检查之前。我建议删除该行,并使用
将嵌套的if合并到单个if语句中

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循环,因为我们不再在子列表中查找单个数字,我们只是在列表中查找


这样做的另一个好处是,现在您可以通过列表切片、添加新的搜索值或删除一些搜索值来更新您的搜索变量,还可以维护您要查找的顺序。在此之前,您必须添加新的搜索变量并将其添加到if语句中

您需要删除第一个“there”打印:

for sublist in data:
    if search1 in sublist:
        if search2 in sublist:
            print("there", sublist)
            found = True

根据对问题的描述,我认为您还应该删除第一个“if(found==False):”部分,否则您将得到多个“notthere”和数据的打印。在本例中-4次打印(3次冗余)。

这将返回匹配的数据项:

>>> 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]]

顺便说一句,编写“found==False”的惯用方法是“not found”。

这真是太棒了,谢谢你,但是它是否可以扩展,以便search1必须是子列表中的第一项,search2必须是第二项?再次感谢。感谢您接受答案,我用您的问题更新了答案:)非常高兴接受这样一个彻底的答案,但是,我讨厌再次这样做:/,我计划将每个子列表附加到三个项目,但仍然只按前两个项目搜索它们。我该怎么做?例如,
data=[[4,3,0],[4,7],[6,3],[9,2]
但是搜索仍然是[4,3],它将返回第一个子列表。但是(抱歉!)并不是所有的子列表都有三个项目,有些可能有两个,希望它仍然可以搜索它们。我想不出一种方法来完成这一点,而不影响我更新答案的效率。你可能想问一个关于它的问题,或者看看你是否能在其他地方找到它。如果我弄明白了,我也会把它贴在这里