3

您如何将以下 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;

我的问题是在 while 测试中我不能有++ior i += 1

4

4 回答 4

10

在 Python 中你不能这样做的问题是 Python 语法的限制。让我们while从文档中了解一下:

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]

如您所见,您必须将表达式放在“ ”之前,whilex += 1是一个语句(并且语句不返回任何值,因此不能用作条件)。

这是这段代码在 Python 中的样子:

i += 1
while a[i] < v:
    if i == hi:
        break
    i += 1

尽管它有效,但它很可能不是解决您问题的 Python 方法。当你有一个集合并且你想使用索引时,你必须期待使用for循环和enumerate内置函数重新设计你的代码。

附言

无论如何,在具有完全不同哲学的语言之间直接移植代码并不是一个好方法。

于 2012-09-08T15:09:18.513 回答
4

Java 代码将 i 设置为第一个元素的索引 >= a[lo],或者设置为 hi,以先出现的为准。所以:

v = a[lo]
for i in range(lo+1, hi+1):
    if a[i] >= v:
        break
于 2012-09-08T15:28:45.727 回答
1

如果要遍历列表中的所有对象或任何“可迭代”事物,请使用“for item in list”。如果您还需要计数器,请使用枚举。如果您想要一个数字范围,请使用 range 或 xrange。

但有时你确实想要一个带有一个计数器的循环,它刚刚上升,你将用 break 或 return 来打破它,就像在原始海报的例子中一样。

对于这些情况,我定义了一个简单的生成器,以确保我不会忘记增加计数器。

def forever(start=0):
    count = start
    while True:
        yield count
        count += 1

然后你可以写这样的东西:

for count in forever():
    if do_something() == some_value:
        break
return count
于 2015-06-09T14:22:25.273 回答
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 程序有一些非常奇怪的地方,它使用列表的方式会允许出现这样的问题。

于 2012-09-08T16:53:00.900 回答