优化多个for循环

时间:2016-02-13 13:19:11

标签: python performance for-loop optimization

我是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并找到了{{1}中的常见元素并将它们添加到新的Lists - plist and klist中,并找到最终List - qlist的长度。我在想如果List的长度非常高,比如4000和两个Lists循环运行4000次迭代是很耗时的,这是我的理解。那么如何才能优化这些问题以及解决这些问题的更好方法是什么,以及哪些方法可以用来改善代码,提高性能并在更短的时间内生成输出。请帮助我理解这一点。提前致谢。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

查看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}

答案 1 :(得分:2)

如果将列表存储为集合,则会丢失订单但查找速度会快得多,因此在这种情况下可以正常工作。然后你可以使用列表理解来检查它们中的任何一个是否有任何值。或者,您可以使用set intersection来查找每个中的值,这可能会更快。

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 :(得分:2)

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

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

这将仅打印常用元素。