简体   繁体   English

如何每第 n 项拆分一个列表

[英]how to split a list every nth item

I am trying to split a list every 5th item, then delete the next two items ('nan').我试图每 5 个项目拆分一个列表,然后删除接下来的两个项目('nan')。 I have attempted to use List[:5], but that does not seem to work in a loop.我曾尝试使用 List[:5],但这似乎在循环中不起作用。 The desired output is: [['1','2','3','4','5'],['1','2','3','4','5'],['1','2','3','4','5'],['1','2','3','4','5']]所需的输出是: [['1','2','3','4','5'],['1','2','3','4','5'], ['1','2','3','4','5'],['1','2','3','4','5']]

List = ['1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan']

for i in List:
    # split first 5 items
    # delete next two items

# Desired output:
# [['1','2','3','4','5'],['1','2','3','4','5'],['1','2','3','4','5'],['1','2','3','4','5']]

There are lots of ways to do this.有很多方法可以做到这一点。 I recommend stepping by 7 then splicing by 5.我建议步进 7 然后拼接 5。

data = ['1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan']

# Step by 7 and keep the first 5
chunks = [data[i:i+5] for i in range(0, len(data), 7)]

print(*chunks, sep='\n')

Output:输出:

['1', '2', '3', '4', '5']
['1', '2', '3', '4', '5']
['1', '2', '3', '4', '5']
['1', '2', '3', '4', '5']

Reference: Split a python list into other “sublists”...参考:将 python 列表拆分为其他“子列表”...

WARNING: make sure the list follows the rules as you said, after every 5 items 2 nan.警告:确保列表遵循您所说的规则,每 5 个项目 2 nan 之后。

This loop will add the first 5 items as a list, and delete the first 7 items.此循环将添加前 5 个项目作为列表,并删除前 7 个项目。

lst = ['1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan']
output = []

while True:
    if len(lst) <= 0:
        break

    output.append(lst[:5])
    del lst[:7]

print(output) # [['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5']]

Generally numpy.split(...) will do any kind of custom splitting for you.通常numpy.split(...)会为你做任何类型的自定义拆分。 Some reference:一些参考:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html

And the code:和代码:

import numpy as np

lst = ['1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan']

ind=np.ravel([[i*7+5, (i+1)*7] for i in range(len(lst)//7)])

lst2=np.split(lst, ind)[:-1:2]

print(lst2)

Outputs:输出:

[array(['1', '2', '3', '4', '5'], dtype='<U3'), array(['1', '2', '3', '4', '5'], dtype='<U3'), array(['1', '2', '3', '4', '5'], dtype='<U3'), array(['1', '2', '3', '4', '5'], dtype='<U3')]
List=['1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan','1','2','3','4','5','nan','nan']
new_list = list()
for k in range(len(List)//7):
    new_list.append(List[k*7:k*7+5])
new_list.append(List[-len(List)%7])

Straightforward solution in case if the list doesn't follow the rules you mentioned but you want to split sequence always between NAN's:如果列表不遵循您提到的规则,但您希望始终在 NAN 之间拆分序列,则为简单的解决方案:

result, temp = [], []

for item in lst:
    if item != 'nan':
        temp.append(item)
    elif temp:
        result.append(list(temp))
        temp = []

使用itertools.groupby还将支持不同长度的块:

[list(v) for k, v in groupby(List, key='nan'.__ne__) if k]

I guess there is more pythonic way to do the same but:我想有更多的 Pythonic 方法可以做同样的事情,但是:

result = []
while (len(List) > 5):
    result.append(List[0:0+5])
    del List[0:0+5]
    del List[0:2]

This results: [['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5']]结果: [['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5'], ['1', '2', '3', '4', '5']]

mainlist=[] 
sublist=[] 
count=0

for i in List:
    if i!="nan" :    
        if count==4:
            # delete next two items
            mainlist.append(sublist)
            count=0
            sublist=[] 

        else:
            # split first 5 items
            sublist.append(i)
            count+=1

I like the splice answers.我喜欢拼接答案。

Here is my 2 cents.这是我的 2 美分。

# changed var name away from var type
myList = ['1','2','3','4','5','nan','nan','1','2','3','4','10','nan','nan','1','2','3','4','15','nan','nan','1','2','3','4','20','nan','nan']
newList = []   # declare new list of lists to create
addItem = []   # declare temp list
myIndex = 0    # declare temp counting variable

for i in myList:
    myIndex +=1
    if myIndex==6:
        nothing = 0  #do nothing
    elif myIndex==7: #add sub list to new list and reset variables
        if len(addItem)>0:
            newList.append(list(addItem))
            addItem=[]
            myIndex = 0
    else:
       addItem.append(i)

#output
print(newList)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM