【问题标题】:Python losing track of index location in for loop when my list has duplicate values当我的列表有重复值时,Python 在 for 循环中丢失索引位置
【发布时间】:2019-06-24 15:27:12
【问题描述】:

我正在尝试迭代列表中的整数对。我想返回总和等于某个变量值的对。

当整数列表没有重复数字时,这似乎工作得很好。但是,一旦我将重复数字添加到列表中,循环似乎对它的位置感到困惑。我是根据我的陈述猜测的:

打印(list.index(item)) 打印(list.index(item2))

这是我的代码:

working_list = [1,2,3,4,5]
broken_list =  [1,3,3,4,5]

def find_pairs(list, k):
  pairs_list = []
  for item in list:
    for item2 in list:
      print(list.index(item))
      print(list.index(item2))
      if list.index(item) < list.index(item2):
        sum = item + item2;
        if sum == k:
          pair = (item, item2)
          pairs_list.append(pair)
  return pairs_list  


### First parameter is the name is the list to check.
### Second parameter is the integer you're looking for each pair to sum to.
find_pairs(broken_list, 6)  

working_list 很好。当我运行 broken_list 寻找总和为 6 的对时,我会返回 (1,5),但我也应该返回 (3,3),但我没有。

【问题讨论】:

  • 对不起,我在第一条评论中犯了一个错误。 list.index() 返回项目与输入匹配的第一个索引。因此,当您有两个相同的项目时,即“3”,list.index(3) 将返回出现 3 的第一个索引。所以当item == 3item2 == 3时if语句不会通过

标签: python-3.x list loops


【解决方案1】:

您正在尝试使用list.index(item) &lt; list.index(item2) 来确保您不会重复计算这些对。但是,broken_list.index(3) 为列表中的第一个和第二个 3 返回 1。 IE。返回值不是您想要的实际索引(除非列表仅包含唯一元素,例如working_list)。要获取实际索引,请使用enumerate。最简单的实现是

def find_pairs(list, k):
  pairs_list = []
  for i, item in enumerate(list):
    for j, item2 in enumerate(list):
      if i < j:
        sum = item + item2
        if sum == k:
          pair = (item, item2)
          pairs_list.append(pair)
  return pairs_list  

对于小列表这很好,但我们可以通过只使用切片循环遍历我们想要的元素来提高效率,从而消除 if 语句:

def find_pairs(list, k):
  pairs_list = []
  for i, item in enumerate(list):
    for item2 in list[i+1:]:
      sum = item + item2
      if sum == k:
        pair = (item, item2)
        pairs_list.append(pair)
  return pairs_list  

变量名注意事项

最后,我要评论一下您选择的变量名:listsum 已经由 Python 定义,因此将它们用作变量名是不好的风格。此外,“items”通常用于指代对象的键值对,因此我也会避免将这个名称用于单个值(我猜像“element”这样的名称更合适)。

【讨论】:

  • 非常感谢,工作就像一个魅力!也感谢关于变量名的提示!
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多