【问题标题】:Optimizing multiple for loops优化多个 for 循环
【发布时间】:2016-05-24 15:39:26
【问题描述】:

我是 Python 新手,目前正在解决问题以提高我的编码技能。我遇到了一个问题,我需要在 python 中从 3 Lists 中找到共同元素并打印共同元素的数量。

我的代码和程序如下:

print "Enter n: "
n = raw_input()
print "Enter the values: "
nlist = map(int, raw_input().split())
print "Enter m: "
m = raw_input()
print "Enter the values: "
mlist = map(int, raw_input().split())
print "Enter k: "
k = raw_input()
print "Enter the values: "
klist = map(int, raw_input().split())
plist = []
qlist = []

for x in range(0,int(n)):
    for y in range(0,int(m)):
        if (nlist[x]==mlist[y]):
            plist.append(nlist[x])

for z in range(0,int(k)):
    for u in range(0,len(plist)):
        if (klist[z]==plist[u]):
            qlist.append(klist[z])

print len(qlist)

首先,我从前两个Lists - nlist and mlist中找到共同的元素,并将它们存储在一个新的List - plist中,然后取出第三个List - klist,在Lists - plist and klist中找到共同的元素,并将它们添加到一个新的List - qlist 并找到了最终 List 的长度。我在想,如果Lists 的长度非常高,比如 4000 和运行 4000 次迭代的两个 for 循环,根据我的理解,这会很耗时。那么如何优化此类问题,解决此类问题的更好方法是什么,以及可以使用哪些方法来改进代码,提高性能并在更短的时间内产生输出。请帮助我理解这一点。提前致谢。非常感谢您的帮助。

【问题讨论】:

    标签: python performance for-loop optimization


    【解决方案1】:

    如果您将列表存储为集合,它们会丢失顺序,但查找速度会更快,因此在这种情况下可以使用。然后,您可以使用列表推导来检查所有 3 个中是否有任何值。或者,您可以使用集合交集来查找每个中的值,这可能会更快。

    nlist = set(nlist)
    mlist = set(mlist)
    klist = set(klist)
    
    way1 = [i for i in nlist if i in mlist and i in klist]
    way2 = list(nlist & mlist & klist)
    

    【讨论】:

    • 如果你有集合,那么交集似乎是一种更自然的方式;使用& 运算符。另外请注意,集合中不能有重复元素。
    • 我意识到在写完第一种方法后不久哈哈,我没有添加关于重复元素的内容,因为他的情况是他只需要每个值中的一个:)
    • 谢谢。我将阅读有关集合的内容并尝试实现集合的概念。
    【解决方案2】:

    看看set.intersection:

    >>> nlist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> mlist = [1, 3, 5, 7, 9]
    >>> klist = [1, 4, 7, 10]
    >>> set(nlist).intersection(mlist)
    {1, 3, 5, 9, 7}
    >>> set(nlist).intersection(mlist).intersection(klist)
    {1, 7}
    

    【讨论】:

    • 非常感谢。我完全忘记了intersection
    【解决方案3】:

    在这里使用集合交集似乎是最好的方法。

    for s in list(set(list1) & set(list2) & set(list3)):
      print s
    

    这将只打印公共元素。

    【讨论】:

    • 谢谢。这有助于我理解解决此类问题的更好方法。
    • 在这里使用集合,看起来很简单,但是速度很慢。你可以使用 numpy.array 做得更好。
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 2015-04-15
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2018-12-23
    • 2016-02-23
    相关资源
    最近更新 更多