【问题标题】:How to iterate each element in list with all the others [duplicate]如何用所有其他元素迭代列表中的每个元素[重复]
【发布时间】:2014-06-29 02:03:08
【问题描述】:

我有一个 n 元素的列表,我想检查列表中的任何元素 x 是否可以通过使用其他元素之一(y ) 与表达式:

x =  y + 1 - 2*(x % 2) 

为此,我需要将列表中的每个元素 x 与所有其他元素一起迭代。我是通过嵌套两个 for 循环 得到的:

_list = [8,2,0,1]
for x in _list:
    for y in _list:
        if(x == y + 1 - 2*(x % 2)):
            # Do something
        else: pass

显然,这个解决方案的问题在于:它使用两个循环而不是一个;每个元素都与自身迭代;并且对 (x,y) 将被检查两次。

有没有其他方法可以用更少的代码更高效地做到这一点?

【问题讨论】:

  • 您的循环将检查 (a,b) 对和 (b,a) 对,但您不必检查这两对吗?你的情况不是对称的,所以你需要双向检查,不是吗?
  • 无论您做什么,都没有从集合中获取所有形式 (x,y) 的对,基本上是 O(n^2) 时间操作?
  • 你也可以应用一些数学。如果x 是偶数,那么当y == x-1 时条件为真。如果x 是奇数,那么当y == x+1 时条件为真——这意味着它也适用于xy 交换。因此,您只需要检查列表是否包含奇数和下一个更高的数字,您可以使用奇数的set 和一个循环来完成。
  • @BrenBarn 这正是我想要的。抱歉问了一个重复,我在问之前搜索过,但我没有找到你指出的问答。谢谢。

标签: python python-3.x


【解决方案1】:

让我们进一步分解您的主要问题。

x = y + 1 (if x is even)
x = y - 1 ( if x is odd)

现在,从上面可以看出,如果 x 是奇数,则 y 是偶数,反之亦然。

此外,x 和 y 距离只有 1 个单位。换句话说,abs(x-y) == 1。然后您的解决方案将简单地归结为找到满足此条件的所有数字。您还可以观察到 x 和 y 是可交换的。

这篇文章没有回答“更少的代码”部分,而是有效地回答了部分。 ;)


更新:我收回最后一句话的前半部分。

>>> from itertools import chain
>>> s =  [8,2,0,1]
>>> s1 = sorted(s)
>>> list(chain(*(((x,y),(y,x)) for (x,y) in zip(s1, s1[1:]) if y-x == 1)))
[(0, 1), (1, 0), (1, 2), (2, 1)]

【讨论】:

    【解决方案2】:

    你只需要检查当前元素之后的元素

    for i in xrange(len(_list)):
      x = _list[i]
      for j in xrange(i+1,len(_list)):
        y = _list[j]
        if (..):
          # do something
    

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 1970-01-01
      • 2015-01-17
      • 2020-12-11
      • 2023-04-07
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多