[英]Looping over a list and saving elements that meet a condition to a new list
我正在尝试遍历列表,并将一些元素保存到新列表中:那些比先前值大50的元素。 我当前的代码仅保存第一个值。 我想要[0, 76, 176, 262, 349]
。
list = [0, 76, 91, 99, 176, 192, 262, 290, 349]
new_list = []
for i in list:
if ((i+1)-i) > 50:
new_list.extend([i])
我想要保存值0、76、176、262和349。
因此,听起来好像您要遍历列表,并且如果当前元素比其前一个元素大50,则将其保存到列表中并重复。 此解决方案假定原始列表已排序。 让我们将其转换为一些代码。
lst = [0, 76, 91, 99, 176, 192, 262, 290, 349]
new_lst = []
for i, num in enumerate(lst):
if i == 0 or num - lst[i-1] > 50:
new_lst.append(num)
print(new_lst)
# [0, 76, 176, 262, 349]
有趣的部分是循环中的条件:
if i == 0 or num - lst[i-1] > 50:
第一部分考虑我们是否在第一个元素上,在这种情况下,我假定您无论如何都想添加该元素。 否则,获取当前元素与原始列表中前一个元素之间的差,并检查该差是否大于50。在两种情况下,我们都希望将元素追加到列表中(因此使用或 )。
list
用作变量,以免隐藏内置的Python类型。 lst.extend([num])
最好写为lst.append(num)
。 enumerate(lst)
允许您轻松获取列表(或任何可迭代的)中每个元素的索引和值。 if ((i+1)-i) > 50
的语句将始终求值为if (1 > 50)
为假。 您正在寻找list
的下一个元素,但i
只是当前元素的值 。 尝试使用itertools
库中的tee()
函数之类的方法来获取多个值,或类似的方法
list = [0, 76, 91, 99, 176, 192, 262, 290, 349]
new_list = []
for i in range(len(list)):
print (i, list[i])
if i == 0 or (list[i] - list[i-1]) > 50:
new_list.append(list[i])
请记住,我没有添加任何检查是否有 i + 1
元素,所以你可能需要做一些错误处理。
编辑
这是我的最终编辑。 我要感谢@Prune实施标准:)
首先,PyCharm中的代码:
二,控制台输出:
for i in range(len(list)-1):
if (list[i+1]-list[i]) > 50:
new_list.append(list[i])
if list[-1] - new_list[-1] > 50:
new_list.append(list[-1]) #for the last element of list
当然,可以使代码更好。 但这应该可行。
您可以将条件放入列表推导中。 另外, 不要给一个变量相同的名称(列表)为内置型。
my_list = [0, 76, 91, 99, 176, 192, 262, 290, 349]
# Start with the first element;
# then grab each element more than 50 greater than the previous one.
new_list = [my_list[0]]
new_list.extend([my_list[i] for i in range(1, len(my_list))
if my_list[i] - my_list[i-1] > 50])
print(new_list)
输出:
[0, 76, 176, 262, 349]
我的解决方案
l = [0, 76, 91, 99, 176, 192, 262, 290, 349]
o = list(l[0]) + [a for a, b in zip(l[1:], l[:-1]) if a - b - 50 > 0]
输出: [0, 76, 176, 262, 349]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.