我想分割一个数字列表,将序列的第一个数字与下一个数字进行比较,以确定它是否更大,在这种情况下,我们创建该子列表,直到找到一个较小的数字。还有彼此
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。这个想法是创建子列表,其中第一个元素是较小的元素。
最佳答案
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 = [[cond]]
>>> res
[[45]]
现在,我们从第二个元素开始迭代列表。 L[1:]
给出这个子列表:
>>> L[1:]
[42, 78, 120, 47, 2, 50, 32, 34]
注意,res[-1]
总是为我们提供列表当前的最后一个元素。它本身必须是列表,如果它大于我们的 cond
,我们会附加下一个数字 (item
)。否则,我们追加一个仅包含一个元素 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()
一次。
关于python - 循环将列表拆分为不同的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17010904/