对的总和:代码战

时间:2016-09-07 20:41:09

标签: python

我最近在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的反馈,这将非常有用,如果有人可以检查这些问题并提供反馈,如果可以进行任何改进,那将非常有用。

1 个答案:

答案 0 :(得分:1)

ints.index(i)并未向您提供您正在使用的i特定事件的索引。如果您需要,则需要enumerate,而不是index

ints.index(i)表示"浏览ints并找到ints第一个元素的索引,等于i&# 34 ;. i没有提供有关ints来自何处的信息,因此index无法告知您正在考虑i的任何特定事件。 enumerate通过保留自己的计数器并在每次生成元素时递增它来避免这个问题,因此它总是知道它所处的索引。