【发布时间】: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时条件为真——这意味着它也适用于x和y交换。因此,您只需要检查列表是否包含奇数和下一个更高的数字,您可以使用奇数的set和一个循环来完成。 -
@BrenBarn 这正是我想要的。抱歉问了一个重复,我在问之前搜索过,但我没有找到你指出的问答。谢谢。
标签: python python-3.x