【问题标题】:Python list comparison generates Infinite LoopPython列表比较生成无限循环
【发布时间】:2018-10-04 22:11:16
【问题描述】:

所以任务是: 取 2 个列表并编写一个程序,该程序返回一个列表,该列表仅包含列表共有的元素而没有重复项,并且它必须适用于不同大小的列表。

我的代码是:

a = [1, 2, 4]
b = [3, 1, 5, 2]

for j < len(a):
    for i < len(b):
        if a(elem) == b(i):
            print (a(elem))
        i=i+1
    j=j+1

然后会生成一个无限循环,它会打印 1 然后永远不会退出。

谁能告诉我为什么会发生无限循环?

我知道这不是最“python”的做事方式,但是我的编码背景包括一个非常小的 C 语言技术,我对 Python 了解不多。

如果有简单的替代方案,请告诉我,以及为什么它永远不会退出。

【问题讨论】:

  • 我在这里看不到列表理解。这运行? for j &lt; len(a): 看起来不像是有效的语法。
  • 这是完全无效的 Python 语法,你是如何执行这个脚本的?
  • 反正解决方案是list(set(a).intersection(b))
  • 另外,ab 都不可调用,因此代码甚至不应该运行,更不用说进入无限循环了。
  • @Carcigenicate 他们说列表比较,但是是的,除非问题被编辑,否则投票结束

标签: python python-3.x list linked-list infinite-loop


【解决方案1】:

我想你想做这样的事情:

a = [1, 2, 4]
b = [3, 1, 5, 2]
j=0
while j < len(a):
print("J:", j)
i = 0
while i < len(b):
    print("I:", i)
    if j == i:
        print ("match :", a[j], b[i])
    i=i+1
j=j+1

或者用 for(更漂亮):

a = [1, 2, 4]
b = [3, 1, 5, 2]

for j in a:
    print("J:", j)
    for i in b:
        print("I:", i)
        if j == i:
            print ("match :", a[j], b[i])

这将显示值相等的索引。

【讨论】:

    【解决方案2】:

    如果你想使用列表理解,请使用类似这样的东西

    [i for i in a if i in b]
    

    哪个输出

    >>> a = [1, 2, 4]
    >>> b = [3, 1, 5, 2]
    >>> [i for i in a if i in b]
    [1, 2]
    
    >>> b = [1, 2, 4]
    >>> a = [3, 1, 5, 2]
    >>> [i for i in a if i in b]
    [1, 2]
    

    或使用@Chris_Rand 的 Clean set 解决方案:

    >>> a = [1, 2, 4]
    >>> b = [3, 1, 5, 2]
    >>> list(set(a).intersection(b))
    [1, 2]
    

    因为我最初认为标题说的是列表理解,所以我给了你一个列表理解的答案。不过,您绝对应该使用 Chris 的设置解决方案。

    这是一个(非统计显着的)基准,说明了原因

    >>> a = list(np.random.randint(0, 10000, size=500))
    >>> b = list(np.random.randint(0, 10000, size=800))
    
    >>> timeit.timeit(stmt='[i for i in a if i in b]', globals=globals(), number=1000)
    9.176704404999327
    
    >>> timeit.timeit(stmt='list(set(a).intersection(b))', globals=globals(), number=1000)
    0.05484662300295895
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 2019-03-25
      • 2017-05-30
      • 2014-11-21
      • 2017-01-23
      相关资源
      最近更新 更多