常用列表元素

时间:2016-01-20 22:00:17

标签: python-2.7

好吧,我有一个小问题:

def common(a,b,c):
    a.sort()
    b.sort()
    c.sort()
    i = 0
    j = 0
    k = 0
    common=False
    while i<len(a) and j<len(b):
        if a[i] == b[j]:
            if b[j] == c[k]:
                return True
            else:
                k = k+1
                continue
        else:
            if i == len(a):
                j = j+1
            else:
                i = i+1
    return common
a=[3, 1, 5, 10]
b=[4, 2, 6, 1]
c=[5, 3, 1, 7]
print common(a,b,c)

基本上,它必须告诉我列表中是否有共同的元素。使用1它可以工作,但是如果我将8替换为1,它就不再起作用了。

3 个答案:

答案 0 :(得分:2)

你的'j'永远不会增加,1正在工作,因为在sort之后它是第一个元素并且不需要增加j

我的建议是将您的列表转换为集合,并使用intersection(&amp;)

检查常用元素
def common(a,b,c):
    common = set(a) & set(b) & set(c)
    return True if common else False


a=[3, 8, 5, 10]
b=[4, 2, 6, 8]
c=[5, 3, 8, 7]
print common(a,b,c)

答案 1 :(得分:0)

您当前的算法仅在b列表中的最小值与其他列表相同时才有效。如果有不同的常用值,您将永远找不到它,因为您将i增加到len(a),然后退出。

我认为您需要更改逻辑,以便增加指向最小值的列表索引。如果a[i]小于b[j],则需要增加i。如果c[k]较少,则应该增加它。

答案 2 :(得分:0)

您编程的内容根本不符合您的期望,因此您需要重新考虑您的逻辑。如果您查看循环,首先要检查a[0]是否与b[0]匹配。不,所以添加到i。然后,您将a[1]b[0],nope等进行比较。如果没有匹配b[0],则退出循环而不检查b的其他元素。它适用于列表中的1,因为在排序之后,这些恰好位于所有三个列表中的第一个位置。

无论如何,这非常笨重。通过集合交叉点可以更轻松地完成此操作。请参阅此相关question