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

时间:2016-05-21 12:51:49

标签: python python-2.7 python-3.x

我在python中有两个列表。现在我想编写一个代码来搜索两个列表中的元素。如果它们具有相同的元素,则返回true,否则返回false。 允许重复,订单可能不同。

注意:    我不想使用“set”in-build函数(因为它使它变得如此简单)或者我不想做这样的事情:                     对于item1,zip2中的item2(list1,list2):                                  ...........                                要么                     if(list1 == list2):                                        返回True 因为只有当元素数量相同且顺序相同时才能这样做

3 个答案:

答案 0 :(得分:0)

这样做的明智方法是使用套装。但是如果你坚持通过循环来低效地执行它,那么你需要检查第一个列表中的每个元素是否是第二个列表的元素,反之亦然。

以下是3种检查方法。请注意(与前一个问题中的代码不同)我直接迭代列表元素;在Python中不需要为此任务使用列表索引。

首先,我们使用显式标记#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)

请注意,u会在找到与v匹配的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)) 后立即停止测试。

现在进行完全匹配测试。此代码适用于Python 2或Python 3。

[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

<强>输出

r = range(1,len(board)+1)
b = block(board,x,y)
nums = [x for x in r if x not in b]

答案 1 :(得分:0)

我会用这样的东西:

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中,则会导致true返回。这对两者都有效。

答案 2 :(得分:-1)

由于您提供了一个示例,我将在此处使用它。

您可以使用itertools.groupby()来获取列表的唯一值,然后比较它们(已排序)。这样,您可以轻松查看它们是否匹配。

  

导入itertools

     

L1 = [1,2,3]

     

L2 = [3,2,2,1]

     

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

L2变为[1,2,3]。

现在就这样做

  

排序(L1)==排序(L2)

(如果他们没有排序)

  

希望这是你正在寻找的......