【问题标题】:Looping through a list not in order in Python在 Python 中循环遍历一个不按顺序排列的列表
【发布时间】:2015-01-04 19:30:28
【问题描述】:

我对编程很陌生,所以请多多包涵……我一直在学习 Python,我刚刚做了一个评估,涉及循环使用您的当前值作为循环时要转到的下一个索引值的列表。问题大致是这样的:

你有一个长度为 N 的正整数和负整数的零索引数组。编写一个函数,遍历列表,创建一个新列表,并返回新列表的长度。在循环遍历列表时,您使用当前值作为下一个要转到的索引值。当 A[i] = -1

时停止循环

例如:

A[0] = 1
A[1] = 4
A[2] = -1
A[3] = 3
A[4] = 2 

这将创建:

newlist = [1, 4, 2, -1]

len(newlist) = 4

时间到了,我没能完成,但这就是我想出的。任何批评表示赞赏。就像我说的那样,我是新手,正在努力学习。与此同时,我会继续寻找。提前致谢!

def sol(A):
    i = 0
    newlist = []
    for A[i] in range(len(A)):
        e = A[i]
        newlist.append(e)
        i == e
        if A[i] == -1:
            return len(newlist)

【问题讨论】:

  • 你有没有试过那里的课程:codility.com/programmers/lessons
  • 到目前为止我已经尝试了几个。我从 Codecademy 上的 Python 课程开始,然后尝试了 Udacity 上的 Comp Science 介绍课程。你还有什么要推荐的吗?

标签: python list python-2.7 loops


【解决方案1】:

如果您希望编写最少的代码行,这可能是最简单的方法。

A = [1,4,-1,3,2]
B = []

n = 0

while A[n] != -1:
    B.append(A[n])
    n = A[n]

B.append(-1)

print(len(B))

【讨论】:

  • 我相信我的编辑可能导致代码与您的过于相似。这一天属于你。
【解决方案2】:

首先,请注意for A[i] in range(len(A)) 是您肯定要避免的模式,因为它是一种晦涩的构造,它将修改列表A,将递增的整数存储到A[i] .要遍历A 的元素,请使用for val in A。要将索引循环到A,请使用for ind in xrange(len(A))

for 循环,通常是首选的 Python 循环结构,不是解决此问题的正确工具,因为该问题需要以序列内容要求的不可预测的顺序迭代序列。为此,您需要使用更通用的while 循环并自己管理列表索引。这是一个例子:

def extract(l):
    newlist = []
    ind = 0
    while l[ind] != -1:
        newlist.append(l[ind])
        ind = l[ind]
    newlist.append(-1)   # the problem requires the trailing -1
    print newlist        # for debugging
    return len(newlist)

>>> extract([1, 4, -1, 3, 2])
[1, 4, 2, -1]
4

请注意,将值收集到新列表中在任何实际场景中都没有任何意义,因为该列表在函数之外以任何方式都不可见。更明智的实现是在每个循环传递中简单地增加一个计数器并返回计数器的值。但由于问题明确要求维护列表,因此必须执行上述代码。

【讨论】:

    【解决方案3】:

    只使用while循环更简单:

    data = [1,4,-1,3,2]
    ls = []
    i = 0
    steps = 0
    while data[i] != -1:
        ls.append(data[i])
        i = data[i]
        steps += 1
        assert steps < len(data), "Infinite loop detected"
    ls.append(-1)
    print ls, len(ls)
    

    【讨论】:

    • 别忘了检查无限循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2018-10-26
    • 2019-04-15
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多