def ListNum(x):
list1 = []
for i in (x):
if x[i] < x [i + 1]:
list1.append[i]
else:
break
return(list1)
ListNum([1,2,3,4,5,6,2,3,4])
因此,我输入了一个数字列表,然后遍历该列表,并检查该列表中的第一个值是否小于第二个值(如果是),将其添加到list1
,继续操作,直到该值大于下一个值。
所以,如果我输入 ListNum([1,2,3,4,5,6,2,3,4])
我应该得到 list1[1,2,3,4,5,6]
但它不起作用
我假设你永远要在添加的最后一个项目x
来list1
,因为没有后可进行对比的项目。
您的代码不能正常工作,因为for i in (x):
在迭代项目中x
,而不是他们的索引。但是,即使它确实遍历了索引,您的代码也可能会崩溃,IndexError
原因是它可能会尝试将列表中的最后一项与其后的一项进行比较(不存在)
这里有几种方法可以做到这一点。
from itertools import takewhile
def list_nums0(x):
list1 = []
for i in range(len(x) - 1):
if x[i] < x[i + 1]:
list1.append(x[i])
else:
break
return list1
def list_nums1(x):
list1 = []
for u, v in zip(x, x[1:]):
if u < v:
list1.append(u)
else:
break
return list1
def list_nums2(x):
list1 = []
for i, u in enumerate(x[:-1], 1):
if u < x[i]:
list1.append(u)
else:
break
return list1
def list_nums3(x):
return [t[0] for t in takewhile((lambda a:a[0] < a[1]), zip(x, x[1:]))]
list_nums = list_nums3
print(list_nums([1,2,3,4,5,6,2,3,4]))
输出
[1, 2, 3, 4, 5]
list_nums0
只需迭代的索引x
。
list_nums1
用于zip
在x
和上并行进行迭代x[1:]
。这会将当前和下一个项目放入u
和中v
。
list_nums2
用于enumerate
获取中的当前项目u
以及中的下一项的索引i
。
list_nums3
用于takewhile
迭代产生的元组,zip
直到我们得到一对不满足测试的项目。它以列表理解的方式执行整个操作,这比.append
在传统for
循环中使用效率更高。
如果到此为止,这些版本也会在列表中添加最后一项。执行此操作的简单方法是创建一个新的临时列表,该列表的最后一项保证大于“实际”最后一项。
from itertools import takewhile
def list_nums0(x):
x = x + [x[-1] + 1]
list1 = []
for i in range(len(x) - 1):
if x[i] < x[i + 1]:
list1.append(x[i])
else:
break
return list1
def list_nums1(x):
list1 = []
for u, v in zip(x, x[1:] + [x[-1] + 1]):
if u < v:
list1.append(u)
else:
break
return list1
def list_nums2(x):
x = x + [x[-1] + 1]
list1 = []
for i, u in enumerate(x[:-1], 1):
if u < x[i]:
list1.append(u)
else:
break
return list1
def list_nums3(x):
return [t[0] for t in takewhile((lambda a:a[0] < a[1]), zip(x, x[1:] + [x[-1] + 1]))]
# test all the functions
funcs = (
list_nums0,
list_nums1,
list_nums2,
list_nums3,
)
data = [1, 2, 3, 4, 5, 6, 0]
print('data', data)
for i, list_nums in enumerate(funcs):
print(i, list_nums(data))
data = [1, 2, 3, 4, 5, 6]
print('data', data)
for i, list_nums in enumerate(funcs):
print(i, list_nums(data))
输出
data [1, 2, 3, 4, 5, 6, 0]
0 [1, 2, 3, 4, 5]
1 [1, 2, 3, 4, 5]
2 [1, 2, 3, 4, 5]
3 [1, 2, 3, 4, 5]
data [1, 2, 3, 4, 5, 6]
0 [1, 2, 3, 4, 5, 6]
1 [1, 2, 3, 4, 5, 6]
2 [1, 2, 3, 4, 5, 6]
3 [1, 2, 3, 4, 5, 6]
当然,如果您传递一个空列表,此策略将失败。解决这个问题的简单方法是将其放在函数顶部:
if not x:
return []
例如,
def list_nums1(x):
if not x:
return []
list1 = []
for u, v in zip(x, x[1:] + [x[-1] + 1]):
if u < v:
list1.append(u)
else:
break
return list1
我们可以这样重写list_nums3
以使其单线:
def list_nums3(x):
return [] if not x else [t[0] for t in takewhile((lambda a:a[0] < a[1]), zip(x, x[1:] + [x[-1] + 1]))]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句