如何将嵌套循环转换为列表理解?
How to convert nested loop to list comprehension?
我正在尝试解决一道算法题。
给定一个数组,计算它的反转次数。比 O(N^2) 时间更快。
我的第一个不满足 O(N^2) 的解决方案使用嵌套循环:
def getInvCount(arr, n):
inv_count = 0
for i in range(n):
for j in range(i + 1, n):
if (arr[i] > arr[j]):
inv_count += 1
return inv_count
我尝试转换为列表理解
def getInvCount(arr, n):
inv_count = 0
inv_count = [j for i in range (n) for j in range(i + 1, n) if (arr[i] > arr[j])]
inv_count += 1
return inv_count
我的解决方案基于此 link
我知道我的语法不正确,尤其是 inv_count += 1
我已经寻找了嵌套循环需要 return 计数的示例,并且是使用列表理解编写的,但我不能'找不到。
理想情况下,函数应该像这样告诉数组中的反转次数;
def getInvCount(arr, n):
inv_count = 0
for i in range(n):
for j in range(i + 1, n):
if (arr[i] > arr[j]):
inv_count += 1
return inv_count
#testdata
arr = [1, 20, 6, 4, 5]
n = len(arr)
print("Number of inversions are", getInvCount(arr, n))
输出
Number of inversions are 5
用我目前的解决方案
def getInvCount(arr, n):
inv_count = 0
inv_count = [j for i in range (n) for j in range(i + 1, n) if (arr[i] > arr[j])]
inv_count += 1
return inv_count
#testdata
arr = [1, 20, 6, 4, 5]
n = len(arr)
print("Number of inversions are", getInvCount(arr, n))
输出
Traceback (most recent call last):
File "and.py", line 24, in <module>
getInvCount(arr, n))
File "and.py", line 16, in getInvCount
inv_count += 1
TypeError: 'int' object is not iterable
sum([1 if (arr[i] > arr[j]) else 0 for i in range(n) for j in range(i+1,n)])
应该作为列表理解答案。几个月前我曾提到 this Whosebug post 做能够做到这一点。
但是,就时间复杂度而言,它不会比 O(N^2) 好。
我正在尝试解决一道算法题。
给定一个数组,计算它的反转次数。比 O(N^2) 时间更快。
我的第一个不满足 O(N^2) 的解决方案使用嵌套循环:
def getInvCount(arr, n):
inv_count = 0
for i in range(n):
for j in range(i + 1, n):
if (arr[i] > arr[j]):
inv_count += 1
return inv_count
我尝试转换为列表理解
def getInvCount(arr, n):
inv_count = 0
inv_count = [j for i in range (n) for j in range(i + 1, n) if (arr[i] > arr[j])]
inv_count += 1
return inv_count
我的解决方案基于此 link
我知道我的语法不正确,尤其是 inv_count += 1
我已经寻找了嵌套循环需要 return 计数的示例,并且是使用列表理解编写的,但我不能'找不到。
理想情况下,函数应该像这样告诉数组中的反转次数;
def getInvCount(arr, n):
inv_count = 0
for i in range(n):
for j in range(i + 1, n):
if (arr[i] > arr[j]):
inv_count += 1
return inv_count
#testdata
arr = [1, 20, 6, 4, 5]
n = len(arr)
print("Number of inversions are", getInvCount(arr, n))
输出
Number of inversions are 5
用我目前的解决方案
def getInvCount(arr, n):
inv_count = 0
inv_count = [j for i in range (n) for j in range(i + 1, n) if (arr[i] > arr[j])]
inv_count += 1
return inv_count
#testdata
arr = [1, 20, 6, 4, 5]
n = len(arr)
print("Number of inversions are", getInvCount(arr, n))
输出
Traceback (most recent call last):
File "and.py", line 24, in <module>
getInvCount(arr, n))
File "and.py", line 16, in getInvCount
inv_count += 1
TypeError: 'int' object is not iterable
sum([1 if (arr[i] > arr[j]) else 0 for i in range(n) for j in range(i+1,n)])
应该作为列表理解答案。几个月前我曾提到 this Whosebug post 做能够做到这一点。
但是,就时间复杂度而言,它不会比 O(N^2) 好。