您如何将以下Java习惯用法翻译成Python?
Comparable[] a, int lo, int hi;
int i = lo, j = hi+1;
Comparable v = a[lo];
while (a[++i] < v) if (i == hi) break;
我的问题是,在测试时我无法拥有++i
或i += 1
。
答案 0 :(得分:8)
你在Python中不能这样做的问题是对Python语法的限制。让我们从文档中了解while
的样子:
while_stmt ::= "while" expression ":" suite
["else" ":" suite]
正如您所看到的,您必须在“:”之前添加表达式,而x += 1
是一个声明(并且语句不会返回任何声明值因此不能用作条件)。
这是Python中代码的样子:
i += 1
while a[i] < v:
if i == hi:
break
i += 1
虽然它有效,但它很可能不是解决问题的Python方法。如果您有一个集合并且想要使用索引,则必须使用for
循环和enumerate
内置函数来重新设计代码。
<强> P.S。强>
无论如何,在具有完全不同的哲学的语言之间直接移植代码并不是一个好方法。
答案 1 :(得分:4)
Java代码将i设置为第一个元素&gt; = a [lo]的索引,或者设置为hi,无论哪个先出现。所以:
v = a[lo]
for i in range(lo+1, hi+1):
if a[i] >= v:
break
答案 2 :(得分:1)
如果要迭代列表中的所有对象或任何可迭代的对象。事情,使用&#34;列表中的项目&#34;。如果您还需要一个计数器,请使用枚举。如果你想要一系列数字,请使用range或xrange。
但是有时候你真的想要一个带有计数器的循环,这个计数器刚刚上升,你可以通过中断或返回来突破,就像在原始海报的例子中一样。
对于这些场合,我定义了一个简单的发生器,以确保我不会忘记增加计数器。
def forever(start=0):
count = start
while True:
yield count
count += 1
然后你可以写下这样的东西:
for count in forever():
if do_something() == some_value:
break
return count
答案 3 :(得分:0)
list
类有一个内置的方法可以进行这种搜索,但无论出于何种原因,它只比较相等。当然,我们可以破解:
class hax:
def __init__(self, value): self.value = value
def __eq__(self, other): return other >= self.value
a.index(hax(a[lo]), lo + 1, hi + 1)
...但请不要:)
无论如何,你不仅不应该试图直接移植代码,正如@Rostyslav建议的那样 - 你不应该直接尝试移植问题。有一些非常奇怪的Python程序使用列表的方式会出现这样的问题。