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

时间:2013-10-03 01:07:52

标签: 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:
            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

4 个答案:

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

顺便说一句,写“找到==错误”的惯用方法是“找不到”。