我在python中有两个列表。现在我想编写一个代码来搜索两个列表中的元素。如果它们具有相同的元素,则返回true,否则返回false。 允许重复,订单可能不同。
注意: 我不想使用“set”in-build函数(因为它使它变得如此简单)或者我不想做这样的事情: 对于item1,zip2中的item2(list1,list2): ........... 要么 if(list1 == list2): 返回True 因为只有当元素数量相同且顺序相同时才能这样做
答案 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)
(如果他们没有排序)
真
希望这是你正在寻找的......