在for循环中使用两个变量进行列表操作
using two variable in for loop for list operations
我希望我的输出是 [i, j] 其中 list[i] + list[j] 等于目标值。例如;
nums=[2,7,11,15]
目标=9
output=[0,1] 作为 num[0]+num[1]==target
的总和
我试过我的代码代码为;
nums=[2,7,11,15]
target=9
b=len(nums)
for i,j in zip(range(b),range(b)):
if nums[i]+nums[j]==target:
print(i,j)
我想 return 列表中元素的位置,其总和等于期望值,我上面的代码没有输出期望值,解决这个问题的最佳方法是什么?
将 j
增加 nums[j+1]
和 zip(range(b),range(b-1))
nums=[2,7,11,15]
target=9
b=len(nums)
for i,j in zip(range(b),range(b-1)):
if nums[i]+nums[j+1]==target:
print(i,j+1)
看看 zip()
做了什么:
list(zip(range(4), range(4)))
[(0, 0), (1, 1), (2, 2), (3, 3)]
您没有迭代所有组合,只是迭代 i = j 的情况。试试 itertools
模块,它为这种情况提供了许多高效的迭代器。
import itertools
nums=[2,7,11,15]
target=9
b=len(nums)
for i,j in itertools.combinations(range(b), 2):
if nums[i]+nums[j]==target:
print(i,j)
https://docs.python.org/3/library/itertools.html#itertools.combinations
您想为 i
的每个值考虑 j
的所有值。 zip()
不这样做,它只考虑每个列表中的对齐对,即 i
和 j
的匹配值。您需要一个嵌套循环,如下所示:
nums=[2,7,11,15]
target=9
b=len(nums)
for i in range(b):
for j in range(b):
if nums[i]+nums[j]==target:
print(i,j)
您可以通过使用 enumerate()
将索引和值放在一起来稍微简化一下:
nums=[2,7,11,15]
target=9
for i, n in enumerate(nums):
for j, m in enumerate(nums):
if m + n == target:
print(i,j)
您可以通过多种方式加快速度:
您可以只考虑 j
个大于或等于 i
的索引,然后在匹配时打印出 i, j
和 j, i
。
如果您知道 nums
已排序,则可以使用从底部向上计数并从顶部向下计数的 while
循环使其更快。这将在找到匹配项时报告匹配项,并在总和太低时增加底部计数器,或者在总和太高时降低顶部计数器。
如果 nums
未排序,基于字典的解决方案(如 @deepak-tripathi's)将是最有效的。该解决方案和移动边界解决方案都具有 O(n) 解决方案时间(相对于嵌套循环的 O(n^2))并且基于字典的解决方案更容易正确编写(例如处理重复值)并且可以处理排序或未排序的列表..
您必须使用嵌套 for 循环。
nums = [2, 7, 11, 15]
target = 9
b = len(nums)
for i in range(b - 1):
for j in range(i + 1, b):
if nums[i] + nums[j] == target:
print(i, j)
如果列表很大或性能很重要,您可以对此类问题进行很多优化。例如,在上面的代码中,先对列表进行排序,从小数开始。如果nums[i] > target
,从外部迭代中断,如果nums[i] + nums[j] > target
,从内部迭代中断。
我认为这个问题可以像这样使用字典来解决:
我打印了元素你也可以得到索引
d_ = {}
nums=[2,7,11,15]
val =None
for i in nums:
if d_.get(i):
d_[i] += 1
else:
d_[i] = 1
target = 17
for i in nums:
if d_.get(target-i, None):
val = (i,target-i)
break
if val:
print(nums.index(val[0]))
print(nums.index(val[1]))
我希望我的输出是 [i, j] 其中 list[i] + list[j] 等于目标值。例如;
nums=[2,7,11,15]
目标=9
output=[0,1] 作为 num[0]+num[1]==target
的总和我试过我的代码代码为;
nums=[2,7,11,15]
target=9
b=len(nums)
for i,j in zip(range(b),range(b)):
if nums[i]+nums[j]==target:
print(i,j)
我想 return 列表中元素的位置,其总和等于期望值,我上面的代码没有输出期望值,解决这个问题的最佳方法是什么?
将 j
增加 nums[j+1]
和 zip(range(b),range(b-1))
nums=[2,7,11,15]
target=9
b=len(nums)
for i,j in zip(range(b),range(b-1)):
if nums[i]+nums[j+1]==target:
print(i,j+1)
看看 zip()
做了什么:
list(zip(range(4), range(4)))
[(0, 0), (1, 1), (2, 2), (3, 3)]
您没有迭代所有组合,只是迭代 i = j 的情况。试试 itertools
模块,它为这种情况提供了许多高效的迭代器。
import itertools
nums=[2,7,11,15]
target=9
b=len(nums)
for i,j in itertools.combinations(range(b), 2):
if nums[i]+nums[j]==target:
print(i,j)
https://docs.python.org/3/library/itertools.html#itertools.combinations
您想为 i
的每个值考虑 j
的所有值。 zip()
不这样做,它只考虑每个列表中的对齐对,即 i
和 j
的匹配值。您需要一个嵌套循环,如下所示:
nums=[2,7,11,15]
target=9
b=len(nums)
for i in range(b):
for j in range(b):
if nums[i]+nums[j]==target:
print(i,j)
您可以通过使用 enumerate()
将索引和值放在一起来稍微简化一下:
nums=[2,7,11,15]
target=9
for i, n in enumerate(nums):
for j, m in enumerate(nums):
if m + n == target:
print(i,j)
您可以通过多种方式加快速度:
您可以只考虑 j
个大于或等于 i
的索引,然后在匹配时打印出 i, j
和 j, i
。
如果您知道 nums
已排序,则可以使用从底部向上计数并从顶部向下计数的 while
循环使其更快。这将在找到匹配项时报告匹配项,并在总和太低时增加底部计数器,或者在总和太高时降低顶部计数器。
如果 nums
未排序,基于字典的解决方案(如 @deepak-tripathi's)将是最有效的。该解决方案和移动边界解决方案都具有 O(n) 解决方案时间(相对于嵌套循环的 O(n^2))并且基于字典的解决方案更容易正确编写(例如处理重复值)并且可以处理排序或未排序的列表..
您必须使用嵌套 for 循环。
nums = [2, 7, 11, 15]
target = 9
b = len(nums)
for i in range(b - 1):
for j in range(i + 1, b):
if nums[i] + nums[j] == target:
print(i, j)
如果列表很大或性能很重要,您可以对此类问题进行很多优化。例如,在上面的代码中,先对列表进行排序,从小数开始。如果nums[i] > target
,从外部迭代中断,如果nums[i] + nums[j] > target
,从内部迭代中断。
我认为这个问题可以像这样使用字典来解决: 我打印了元素你也可以得到索引
d_ = {}
nums=[2,7,11,15]
val =None
for i in nums:
if d_.get(i):
d_[i] += 1
else:
d_[i] = 1
target = 17
for i in nums:
if d_.get(target-i, None):
val = (i,target-i)
break
if val:
print(nums.index(val[0]))
print(nums.index(val[1]))