微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 for 循环中使用两个变量进行列表操作

如何解决在 for 循环中使用两个变量进行列表操作

我希望我的输出是 [i,j] 其中 list[i] + list[j] 等于目标值。例如;

nums=[2,7,11,15]

目标=9

output=[0,1] 作为 num[0]+num[1]==target 的总和

我尝试了我的代码代码

nums=[2,15]
target=9
b=len(nums)
for i,j in zip(range(b),range(b)):
    if nums[i]+nums[j]==target:
        print(i,j)

我想返回列表中总和等于所需值的元素的位置,我上面的代码没有输出所需的值,解决这个问题的最佳方法是什么?

解决方法

看看 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

,

您希望为 j 的每个值考虑 i 的所有值。 zip() 不这样做,它只考虑来自每个列表的对齐对,即 ij 的匹配值。您需要一个嵌套循环,如下所示:

nums=[2,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,15]
target=9
for i,n in enumerate(nums):
    for j,m in enumerate(nums):
        if m + n == target:
            print(i,j)

有多种方法可以加快速度:

您可以只考虑大于或等于 ji 索引,然后在匹配时打印出 i,jj,i

如果您知道 nums 已排序,则可以通过使用从底部向上计数并从顶部向下计数的 while 循环使其更快。这将在找到匹配项时报告匹配项,并在总和太低时提高底部计数器或在总和太高时降低顶部计数器。

如果 nums 没有排序,像@deepak-tripathi 这样的基于字典的解决方案将是最有效的。这和移位边界解决方案都有 O(n) 解决方案时间(与嵌套循环的 O(n^2) 相比)并且基于字典的解决方案更容易正确编写(例如处理重复值)并且可以处理排序或未排序的列表..

,

你必须使用嵌套的 for 循环。

nums = [2,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,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]))
,

通过 jnums[j+1] 增加 zip(range(b),range(b-1))

nums=[2,j in zip(range(b),range(b-1)):
    if nums[i]+nums[j+1]==target:
        print(i,j+1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?