Python 每N个元素一次,而不是从第一个元素开始
如何将python列表优雅地分隔为两个,以便第二个列表具有第一个列表的每n个元素,并且这些切片的元素从第一个列表中删除切片不应以第一个元素开始强> 例如:Python 每N个元素一次,而不是从第一个元素开始,python,list,slice,Python,List,Slice,如何将python列表优雅地分隔为两个,以便第二个列表具有第一个列表的每n个元素,并且这些切片的元素从第一个列表中删除切片不应以第一个元素开始 例如: split_data([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]) 应该回来 ([1,2,3,4,6,7,8,9,11,12,13,14],[5,10,15]) 谢谢:) 编辑: 对于选择每个第n个元素的部分,我尝试了以下方法: test = data[::5] train = data del data[::5
split_data([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
应该回来
([1,2,3,4,6,7,8,9,11,12,13,14],[5,10,15])
谢谢:)
编辑:
对于选择每个第n个元素的部分,我尝试了以下方法:
test = data[::5]
train = data
del data[::5]
return (train, test)
然而,对于分割数据(列表(范围(1,30)),这只会返回([2,3,4,5,7,8,9,10,12,],[1,6,11,16,21,26])
。
使用优雅,我想表示我希望避免使用for循环来迭代列表;) 您可以利用list.pop()
按索引删除元素并返回它。所以您的原始列表将不包含这些数字,通过创建一个包含弹出项的新列表,您可以拥有第二个列表
def拆分(左、右):
返回值(l[l.pop(i)表示范围(n,len(l,n)])
>>>l=列表(范围(1,16))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
>>>拆分(l,4)
([1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14], [5, 10, 15])
这将改变作为参数传递的列表。如果您想让函数保持原样,只需在处理l
之前添加l=list(l)
。
由于@abstractbyte,此答案无效,因为list.pop()
会在迭代时减少列表的长度,最终导致索引超出范围。
然而,使用numpy
或pandas
仍然可以“优雅地”解决同样的问题:
- 努比:
def slice\u numpy(长、宽):
l=np.数组(l)
遮罩=列表(范围(n-1,透镜(l),n))
返回np.delete(l,掩码),l[掩码]
#请注意,“len”和“delete”将在1D阵列上正常工作。如果有二维数据集,则需要相应地修改它们
- 熊猫
def切片(左、右):
l=pd.系列(l)
遮罩=列表(范围(n-1,透镜(l),n))
返回l.drop(mask),l[mask]
- 例如:
>l=列表(范围(1,16))
>>>l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
>>>
>>>
>>>列车,测试=切片(l,5)
>>>训练
数组([1,2,3,4,6,7,8,9,11,12,13,14])
>>>试验
数组([5,10,15])
>>>
>>>
>>>训练,测试=切片(l,5)
>>>训练
0 1
1 2
2 3
3 4
5 6
6 7
7 8
8 9
10 11
11 12
12 13
13 14
数据类型:int64
>>>试验
4 5
9 10
14 15
数据类型:int64
您已经尝试过哪些“不优雅”?您能告诉我们到目前为止您尝试了什么以及为什么它不能解决您的问题吗?纯代码编写请求与堆栈溢出无关-我们希望这里的问题与特定编程问题相关-但我们很乐意帮助您自己编写!告诉我们,你被困在哪里了。这也将有助于我们更好地回答您的问题。谢谢您的建议,我已经编辑了我的帖子。顺便说一下:从您的培训
/测试
名称来看,您似乎在做分类/ML工作。那么您可能正在/应该使用numpy数组、pandas数据帧或类似的东西,而不是列表。这样可以做得更优雅谢谢你,我不知道pop()
:)的这个功能,使用pop()
在你介绍的示例中确实有效,但是对于长度(甚至稍长)更大的列表,代码会抛出一个执行,因为当我们弹出列表的元素时,我们会减小它的大小,迟早,我们会尝试访问不再在列表中的索引。这是真的。我正在更新我的答案,现在看看,这是一个非常有趣的方法。而且效果很好;)再次感谢你