Python 如何在发电机内部破裂?
如果条件满足,如何中断一次。 我不想使用另一个for循环,我希望代码简单。 以及如何使结果列表成为单个维度。 现在列表是[[1]、[2]、[3]]Python 如何在发电机内部破裂?,python,list,loops,generator,Python,List,Loops,Generator,如果条件满足,如何中断一次。 我不想使用另一个for循环,我希望代码简单。 以及如何使结果列表成为单个维度。 现在列表是[[1]、[2]、[3]] 我希望它是[1,2,3]这很简单,您只需将它转换为for循环 事实上,你不想要一个for循环,这是你必须要处理的事情 def permutationEquation(p): result=[] for i in range(1,len(p)+1): result.append(list(
我希望它是[1,2,3]这很简单,您只需将它转换为
for
循环
事实上,你不想要一个for循环,这是你必须要处理的事情
def permutationEquation(p):
result=[]
for i in range(1,len(p)+1):
result.append(list(y+1 for y,v in enumerate(p) if(p[v-1]==i)))
如果输入
p
是一个置换,那么您的函数计算的是p
到-2的幂,或者置换的倒数的平方。这可以用线性时间计算(排列大小是线性的),而代码使用二次时间
我还建议在排列中使用数字0,1,…,n-1,因为这与Python基于0的索引相结合会更好。当使用这些简单的数字时,这里有一个简单的函数来解决您的问题:
def permutationEquation(p):
result = []
for i in range(1, len(p)+1):
for y, v in enumerate(p):
if p[v-1] != i:
break
result.append(y + 1)
发电机是不可能停下来的。你只能停止使用它(这是一个巨大的提示,应该让你用谷歌搜索一下)。发布你的输入
p
value你只需使用next()
而不是list()
,你就会得到想要的结果。也许result.extend(y+1代表y,v在枚举(p)中如果(p[v-1]==i))
。这将append()
更改为extend()
,并且由于extend()
接受迭代器,因此它不再调用list()
。(当然,它仍然效率低下。)您可以让枚举
从1开始,而不是从0开始;这可能会简化很多关于索引的争论。在我看来,这既满足OP的破坏要求,又不满足列表列表的要求。我试着在hackerank中这样做。我不认为你的解决方案合适。它会导致索引超出范围错误。@ShashiTunga正如我在回答中提到的,你需要将索引调整为零基,因此你需要从读取的每个整数中减去一,然后在打印结果时再加一。
def permutationEquation(p):
inv = [None] * len(p)
for i, x in enumerate(p):
inv[x] = i
return [inv[x] for x in inv]