2

我想拆分一个数字列表,将序列的第一个数字与下一个数字进行比较,以确定它是否更大,在这种情况下,我们创建该子列表,直到找到一个更小的数字。和彼此

Inputdata = [45,42,78,120,47,2,50,32,34]

比较 45 和 42 不是更大,所以只用 45 创建列表,然后从 42 开始与下一个比较,直到找到小于 42 的:

Output = [45] [42,78,120,47] [2,50,32,34]

这是我的代码:

data = [45,42,78,120,47,2,50,32,34]

m = (len(data))
i=0
list1=[]
emptylist = True
while i <= m:

 for j in range(i+1,len(data)-1):


    if data[i] < data[j]:
        list1.append(data[j])
        emptylist = False

    else:

        if emptylist:

            list1.insert(0,data[i])
            print list1
            i += j
            list1 = []
            emptylist = True
            break

        else:
            list1.insert(0,data[i])
            print list1
            print j
            i += j
            print i
            list1 = []
            emptylist = True
            i += j
            break

我的输出是:

[45]
[42, 78, 120, 47]

我找不到问题......有什么建议吗?谢谢

PD1。这个想法是创建子列表,其中第一个元素是较小的元素。

4

1 回答 1

4
L = [45, 42, 78, 120, 47, 2, 50, 32, 34]

cond = L[0]
res = [[cond]]
for item in L[1:]:
    if item > cond:
        res[-1].append(item)
    else:
        cond = item
        res.append([cond])

现在res是:

[[45], [42, 78, 120, 47], [2, 50, 32, 34]]

细节:

索引0为您提供了第一个元素:

>>> cond = L[0]
>> cond
45

我们创建一个新的列表res来保存我们的结果并将45,即第一个元素放入一个列表中,该列表又成为 的第一个元素res

>>> res = [[cond]]
>>> res
[[45]]

现在,我们从第二个元素开始迭代列表。L[1:]给出这个子列表:

>>> L[1:]
[42, 78, 120, 47, 2, 50, 32, 34]

注意,res[-1]总是给我们当前列表的最后一个元素。这本身必须是列表,item如果它大于我们的,我们附加下一个数字 () cond。否则,我们追加一个只有一个元素的新子列表res.append([cond])。在下一轮我们做同样的事情。因此,构成我们中最后一个元素的列表res将随着item > cond. 如果没有,我们将添加一个新列表cond。冲洗并重复,直到原始列表结束。

变化

L[1:]复制L. _ 这不是最有效的方法。如果我们L 变成一个迭代器,我们可以避免这种情况:

L = iter([45,42,78,120,47,2,50,32,34])
cond = next(L)
res = [[cond]]
for item in L:
    if item > cond:
        res[-1].append(item)
    else:
        cond = item
        res.append([cond])

每个next(L)都会给我们迭代器中的下一个项目。for 循环将遍历其余部分。所以在我们的例子中,它从第二个元素开始,因为我们调用了next()一次。

于 2013-06-09T15:30:49.837 回答