我的最后一个问题是能够准确比较两个没有相同元素的相同大小的列表。除了列表方法len,del,index外,我不能使用任何内置的Python函数(即sort,compare,Counter)。
我的代码:
def SameStuff(l1, l2):
if len(l1) <= 1 or len(l2) <= 1 or len(l1) != len(l2):
if len(l1) == 0 or len(l2) == 0:
return len(l1) == len(l2)
else:
return len(l1) == len(l2) and l1[0] == l2[0]
else:
if l1[0] == l2[0]:
return SameStuff(l1[1:], l2[1:])
else:
return SameStuff(l1, l2[1:]+[l2[0]])
答案 0 :(得分:0)
def SameStuff(l1, l2):
if l1 == []: return l2 == []
if len(l1) != len(l2): return False
else: return SameStuff(l1[1:], [x for x in l2 if x != l1[0]])
这可以独立工作。
以下版本还允许重复列表中的元素。
def SameStuff(l1, l2):
if l1 == []: return l2 == []
elif len(l1) != len(l2): return False
elif l1[0] in l2:
i = l2.index(l1[0])
return SameStuff(l1[1:], l2[:i] + l2[i+1:])
else: return False
答案 1 :(得分:0)
您的解释令人困惑:
比较两个相同大小且没有共同元素的列表
您如何比较没有共同点的列表?似乎您想比较两个列表以查看它们是否包含相同的元素,但是顺序是否相同。至于仅通过功能/方法len()
,del()
和index()
来做到这一点,我相信只需index()
就可以做到:
def SameStuff(l1, l2):
if l1 and l2: # both contain something
try:
index = l2.index(l1[0])
return SameStuff(l1[1:], l2[:index] + l2[1 + index:]) # recurse
except ValueError:
return False # a value in one wasn't found in the other
return not(l1 or l2) # only one contains something (False), or neither do (True)
此解决方案也不会破坏其论点。
答案 2 :(得分:0)
比较2个列表而不考虑顺序的最有效方法是使用collections.Counter
,因为它的平均时间复杂度仅为O(n),但是由于您无法使用它,因此可以改为实现您自己使用同一主体,使用两个dict来跟踪每个列表中每个不同项目的计数:
def compare(l1, l2, d1=None, d2=None):
if not d1:
d1, d2 = {}, {}
if l1 and l2:
d1[l1.pop()] = d1.get(l1[-1], 0) + 1
d2[l2.pop()] = d2.get(l2[-1], 0) + 1
return compare(l1, l2, d1, d2)
elif not l1 and not l2:
return d1 == d2
return False
这样:
print(compare([2, 3, 5, 3], [3, 5, 2, 3]))
print(compare([2, 3, 5, 2], [3, 5, 2, 3]))
print(compare([2, 3, 5, 2], [3, 5, 2]))
将输出:
True
False
False
请注意,对列表进行切片或使用list.index
的任何方法总是效率低下,因为它需要O(n)为列表中的每个项目执行每个操作,从而导致O(n ^ 2 )的总体时间复杂度。