你好 我写了一个小函数,它带有两个列表,并将它们作为复制对进行比较, 并返回一个布尔值。
例如([1,2,3],[2,1,4])返回false并且([1,2,3],[3,4,5])返回true 但我希望这个论点可以采用任何给定数量的列表,而不仅仅是两个。
到目前为止,这是我的计划:
def check(xrr, yrr):
x = xrr[:]
x.sort()
y = yrr[:]
y.sort()
for i in range(len(x)-1):
if x[i]==y[i]:
return False
return True
但它还没有完全正常工作,因为([1,2,3],[1,4,5])也会返回false。
非常感谢任何提示和想法
答案 0 :(得分:3)
import itertools
def check(*args):
r = None
for l in args:
s = set(frozenset(x) for x in itertools.combinations(l, 2))
if r is None:
r = s
else:
r &= s
if not r:
return True
return False
print check([1, 2, 3], [3, 4, 5])
print check([1, 2, 3], [2, 1, 4])
答案 1 :(得分:3)
def dupLists(List0,*Lists):
result=set(List0)
for l in Lists:
result=result.intersection(l)
if len(result)<2:
return True
return False
答案 2 :(得分:1)
作为一个天真的实现,您可以定义列表列表并散列内部表示。例如:
def check(given):
hash = {}
for li in given:
for val in li:
if val in hash:
return False
hash[val] = 1
return True
如果输入数据集包含相对于内存的少量唯一元素,则此方法有效。如果您希望收到极大的数据集,则可能需要考虑更复杂的方法。
另外值得注意的是,这将为同一数据集中的重复元素返回False
,并在数据集内的任何位置重复值。这很难重构,或完全重写为此处列出的其他解决方案。