我如何使用python代码来迭代两个列表并找出它们是否匹配

2024-04-20 08:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子Python。现在我想写一个代码,将搜索两个元素列表。如果它们有相同的元素它返回true或false。 允许重复,顺序可以不同。你知道吗

注: 我不想在build函数中使用“set”(因为它使它变得非常简单),或者我不想这样做: 对于zip中的item1、item2(list1、list2): ........... 或 如果(list1==list2): 返回True 因为只有当元素的数量和顺序相同时,才能这样做


Tags: 函数代码buildfalsetrue元素列表顺序
3条回答

明智的方法是使用集合。但是如果您坚持通过循环来降低效率,那么您需要检查第一个列表的每个元素是否都是第二个列表的元素,反之亦然。你知道吗

这里有三种方法来做检查。请注意(与前面问题中的代码不同),我直接遍历list元素;在Python中,这个任务不需要使用list索引。你知道吗

首先,我们使用显式标志ok来跟踪匹配。你知道吗

#Test if each element of `b` is also an element of `a`
def contains(a, b):
    for v in b:
        ok = False
        for u in a:
            if v == u:
                ok = True
                break
        if not ok:
            return False
    return True

这可以通过将else子句附加到内部for循环来压缩:

def contains(a, b):
    for v in b:
        for u in a:
            if v == u:
                break
        else:
            return False
    return True

但是我们可以通过使用内置的any函数和生成器表达式来缩短它:

def contains(a, b):
    for v in b:
        if not any(v == u for u in a):
            return False
    return True

请注意,any(v == u for u in a)一旦找到与v匹配的u,就会停止测试。你知道吗

现在进行完全匹配测试。这段代码适用于python2或python3。你知道吗

from __future__ import print_function

def contains(a, b):
    for v in b:
        if not any(v == u for u in a):
            return False
    return True

def match(a, b):
    return contains(a, b) and contains(b, a)

target = [1,2,3,4,5]
data = ([3,5,1,2,4], [1,2,3,4,5,6], [1,2,3,4,6], [3,1,2,1,4])

print(target)
for seq in data:
    print(seq, contains(target, seq), contains(seq, target), match(target, seq))

输出

[1, 2, 3, 4, 5]
[3, 5, 1, 2, 4] True True True
[1, 2, 3, 4, 5, 6] False True False
[1, 2, 3, 4, 6] False False False
[3, 1, 2, 1, 4] True False False

我会用这样的方法:

def list_check(a, b):
    for item in a:
        if item in b:
            return True
    return False

或者,如果你想找更复杂但更简短的东西,我会这么说:

check = lambda a,b: {'answer': True if True in [True if x in b else False for x in a] else False}['answer']

result:
l_1 = [1, 2]
l_2 = [1, 2, 3, 4]
print check(l_1, l_2)
True

l_1 = ['c', 3 , 9]
l_2 = ['cat', 4, '9']
print check(l_1, l_2)
False

注意:对不起,所有的编辑,有一个逻辑缺陷,在第二个方法,这将导致真正的返回,只有当最后一个元素的a是在b。这将工作的两个。你知道吗

既然您提供了一个示例,我就在这里使用它。你知道吗

你可以用itertools.groupby组()获取列表的唯一值,然后比较它们(排序)。这样,你就可以很容易地看到他们是否匹配。你知道吗

import itertools

L1 = [1,2,3]

L2 = [3,2,2,1]

[i for i,j in itertools.groupby(sorted(L2))]

L2变为[1,2,3]。你知道吗

所以现在就做吧

sorted(L1) == sorted(L2)

(以防未分类)

True

希望这就是你要找的。。。你知道吗

相关问题 更多 >