我最近在Codewars中解决了一个问题( NOT 要求解决方案,已经解决了它)虽然它不是优化的解决方案,但我遇到了一个非常有趣的问题,我无法解决找出答案。
我无意提供解决方案,但只是了解导致此异常的情况
问题是 - 给定一个整数列表和一个和值,返回前两个值(请从左边解析)按照外观的顺序返回以形成总和。
非常简单的问题和我想出的直截了当的最佳解决方案 -
def sum_pairs(ints, s):
indices = []
for i in ints:
if (s-i) in ints[ints.index(i)+1:]:
print(ints.index(i))
print(ints[ints.index(i)+1:])
print(i,s-i)
indices.append([ints.index(i),ints[ints.index(i)+1:].index(s-i)+len(ints[:ints.index(i)])+1])
if(len(indices) == 0):
return None
print(indices)
indices.sort(key=lambda x: x[1])
print(indices)
return [ints[indices[0][0]], ints[indices[0][1]]]
我通过了所有测试用例。
我利用print语句进行调试并弄清楚发生了什么。下面给出了样本测试用例及其难以理解的输出。
sum_pairs([1, 2, 3, 4, 1, 0], 2)
0
[2, 3, 4, 1, 0]
(1, 1)
1
[3, 4, 1, 0]
(2, 0)
0
[2, 3, 4, 1, 0]
(1, 1)
[[0, 4], [1, 5], [0, 4]]
[[0, 4], [0, 4], [1, 5]]
sum_pairs([10, 5, 2, 3, 7, 5])
1
[2, 3, 7, 5]
(5, 5)
3
[7, 5]
(3, 7)
1
[2, 3, 7, 5]
(5, 5)
[[1, 5], [3, 4], [1, 5]]
[[3, 4], [1, 5], [1, 5]]
所以现在对于我无法弄清楚的部分,观察输出可以看出在测试用例1中,0被打印两次并且整数[ints.index(i)+1:]是[2,3]对于位置0和4处的1,并且条目[0,4]被附加两次,为4,1,0]。 在测试用例2中观察到类似的模式。 if条件说
if (s-i) in ints[ints.index(i)+1:]
不应该第二次被评估为真,因为整数[ints.index(i)+1:]用于确保新列表从i出现的项目开始。
当我得到解决方案时似乎并不重要,但如果有人能够了解实际发生的事情,那就太棒了。
注意:我有两次糟糕的经历,人们在没有按照预定义的比例给出理由的情况下投票。如果我可以获得任何此类downvote的反馈,这将非常有用,如果有人可以检查这些问题并提供反馈,如果可以进行任何改进,那将非常有用。
答案 0 :(得分:1)
ints.index(i)
并未向您提供您正在使用的i
特定事件的索引。如果您需要,则需要enumerate
,而不是index
。
ints.index(i)
表示"浏览ints
并找到ints
的第一个元素的索引,等于i
&# 34 ;. i
没有提供有关ints
来自何处的信息,因此index
无法告知您正在考虑i
的任何特定事件。 enumerate
通过保留自己的计数器并在每次生成元素时递增它来避免这个问题,因此它总是知道它所处的索引。