简体   繁体   中英

Split list with multiple list according with a specific element

I have a list of coordinates that are generated by an android app. What I want is to automatically split the list every time it finds the element (0.0,0.0) into another list and when it finds the next (0.0,0.0) it will split that into another list and so on. The number of elements (0.0,0.0) depends on how many times I run the app, so in the example, I ran the app 3 times but if I had run 4 I would need to split the big_list into 4 lists. With that, the size of the big_list and the number of (0.0,0.0) elements that determine the number of splits depends on how many times I ran the app before I export the file from the database and load it on python to do the analysis.

Here's the example:

big_list = [**(0.0, 0.0)**, (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564), **(0.0, 0.0)**, (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066), **(0.0, 0.0)**, (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]

And what I want is 3 lists starting with the element (0.0,0.0) and the following elements until finds the next (0.0,0.0) to split again:

list1 = [(0.0, 0.0), (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564)]

list2= [(0.0, 0.0), (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066)]

list3 = [(0.0, 0.0), (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]

this method will give you an answer you needed

def split_list(input_list:list) -> list:
    start_ind=0
    result = []
    for ind, x in enumerate(input_list):
        if ( x == (0.0, 0.0) or ind == len(input_list)-1 ) and ind != 0:
            result.append(input_list[start_ind:ind])
            start_ind=ind
    return result

I agree with @conol answer but you can just add this extra step and get the result you want.

basically, we are splitting list on delimiter you have written then we are updating locale with code so you will get dynamically created variable at runtime

def split_list(input_list:list) -> list:
    start_ind=0
    dict = {}
    varname= 'list'
    counter = 0
    for ind, x in enumerate(input_list):
        if ( x == (0.0, 0.0) or ind == len(input_list)-1 ) and ind != 0:
            dict[varname+str(counter)] = input_list[start_ind:ind]
            start_ind=ind
            counter+=1
    return dict

locals().update(split_list(a))
print(list0,list1,list2)

For example, a function can be defined that loops over the entries of the big list and creates the sub-lists (with type annotations):

from pprint import pprint
from typing import List, Optional, Tuple


def split_big_list(
        big_list: List[Tuple[float, float]],
) -> List[List[Tuple[float, float]]]:
    result: List[List[Tuple[float, float]]] = []
    current_list: Optional[List[Tuple[float, float]]] = None
    for entry in big_list:
        if entry == (0.0, 0.0):
            current_list = [entry]
            result.append(current_list)
        elif current_list is None:
            # ignore entries before first tuple with zeros
            continue
        else:
            current_list.append(entry)

    return result


BIG_LIST = [(0.0, 0.0), (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564), (0.0, 0.0), (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066), (0.0, 0.0), (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]
lists = split_big_list(BIG_LIST)
pprint(lists)

Result:

[[(0.0, 0.0),
  (0.7061503529548645, -0.5579889416694641),
  (1.412300705909729, -1.1159778833389282),
  (2.1184511184692383, -1.673966884613037),
  (2.824601411819458, -2.2319557666778564)],
 [(0.0, 0.0),
  (0.6936703324317932, -0.573429524898529),
  (1.3873406648635864, -1.146859049797058),
  (2.0810110569000244, -1.7202885150909424),
  (2.7677958011627197, -2.3019471168518066)],
 [(0.0, 0.0),
  (0.6973708868026733, -0.5689234137535095),
  (1.3947417736053467, -1.137846827507019),
  (2.0921125411987305, -1.7067701816558838),
  (2.7894835472106934, -2.275693655014038),
  (3.4868545532226562, -2.8446171283721924),
  (4.184225559234619, -3.4135406017303467)]]

Use enumerate to find the indexes of the (0,0) items. Then zip() to pair them up with teir successor to form sub ranges:

starts   = [i for i,v in enumerate(big_list) if v == (0,0)]
sublists = [big_list[s:e] for s,e in zip(starts,starts[1:]+[None])]

print(sublists)
[[(0.0, 0.0), (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564)], 
 [(0.0, 0.0), (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066)], 
 [(0.0, 0.0), (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]]


# if you want them in variables 
# (but then you need to know how many subslits there are ahead of time):

lst1,lst2,lst3 = sublists

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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