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]
但它不起作用
答案 0 :(得分:2)
您不需要索引,您可以像这样压缩列表:
def ListNum(x):
list1 = []
for e1, e2 in zip(x, x[1:]):
if e1 < e2:
list1.append(e1)
else:
break
return list1
这也有利于在列表排序时修复错误。
答案 1 :(得分:1)
如果您执行for i in x
,则会遍历x
中的元素,而不是其索引。
要遍历索引,您必须执行for i in range(len(x))
。
答案 2 :(得分:1)
我认为您从不想要将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]))]