我有一个 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)对将被检查两次。
还有其他方法可以用更少的代码和更高效的方式来实现这一目标吗?
答案 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