2

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

4 回答 4

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 语句中。

于 2013-10-03T01:13:53.303 回答
0

有一些更好的方法可以做到这一点(您可能想在列表上查找排序方法的 'key' 参数),您发布的代码的问题在第 7 行:print("there", sublist)。您应该只在两次检查都通过后打印,但该行出现在第一次检查之后和第二次检查之前。我建议删除该行并将嵌套的 if 组合成一个使用and.

于 2013-10-03T01:12:53.467 回答
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 个冗余)。

于 2013-10-03T01:16:21.667 回答
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]]

顺便说一句,写“found==False”的惯用方式是“未找到”。

于 2013-10-03T01:16:37.740 回答