【问题标题】:Common List Elements通用列表元素
【发布时间】:2016-04-26 23:20:08
【问题描述】:

好的,我有一个小问题:

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,它就不再工作了。

【问题讨论】:

    标签: python-2.7


    【解决方案1】:

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

    我的建议是将您的列表转换为集合并使用交集(&)检查常见元素

    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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        无论如何,这很笨拙。通过设置交叉点有一种更简单的方法。看到这个相关的question

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-03
          • 2023-03-23
          • 1970-01-01
          相关资源
          最近更新 更多