如何使用所有其他元素迭代列表中的每个元素

时间:2014-06-29 02:03:08

标签: python python-3.x

我有一个 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)对将被检查两次。

还有其他方法可以用更少的代码和更高效的方式来实现这一目标吗?

2 个答案:

答案 0 :(得分:2)

让我们进一步打破你的主要问题。

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

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

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

这篇文章没有回答“少代码”部分,但有效地回答了部分内容。 ;)


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

>>> 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)]

答案 1 :(得分:1)

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

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