How to separate a Python list into two lists, according to some aspect of the elements

后端 未结 8 702
小鲜肉
小鲜肉 2021-01-06 05:23

I have a list like this:

[[8, \"Plot\", \"Sunday\"], [1, \"unPlot\", \"Monday\"], [12, \"Plot\", \"Monday\"], [10, \"Plot\", \"Tuesday\"], [4, \"unPlot\", \"         


        
相关标签:
8条回答
  • 2021-01-06 05:43

    I have a helper function for the general case of partitioning a list in two:

    def partition(iterable, condition):
            def partition_element(partitions, element):
                (partitions[0] if condition(element) else partitions[1]).append(element)
                return partitions
            return reduce(partition_element, iterable, ([], []))
    

    For example:

    >>> partition([1, 2, 3, 4], lambda d: d % 2 == 0)
    ([2, 4], [1, 3])
    

    Or in your case:

    >>> partition(your_list, lambda i: i[1] == "Plot")
    
    0 讨论(0)
  • 2021-01-06 05:45

    Try:

    yourList=[[8, "Plot", "Sunday"], [1, "unPlot", "Monday"], [12, "Plot", "Monday"], [10, "Plot", "Tuesday"], [4, "unPlot", "Tuesday"], [14, "Plot", "Wednesday"], [6, "unPlot", "Wednesday"], [1, "unPlot", "Thursday"], [19, "Plot", "Thursday"], [28, "Plot", "Friday"], [10, "unPlot", "Friday"], [3, "unPlot", "Saturday"]]
    plotList=[]
    unPlotList=[]
    
    for i in yourList:
        if "Plot" in i:
            plotList.append(i)
        else:
            unPlotList.append(i)
    

    or shorter with comprehension:

    plotList = [i for i in yourList if "Plot" in i]
    unPlotList = [i for i in yourList if "unPlot" in i]
    
    0 讨论(0)
  • 2021-01-06 05:51

    You can also do it with the filter command:

    list1 = filter(lambda x: x[1] == "Plot", list)
    list2 = filter(lambda x: x[1] == "unPlot", list)
    
    0 讨论(0)
  • 2021-01-06 05:52

    You could use list comprehensions, e.g.

    # old_list elements should be tuples if they're fixed-size, BTW
    list1 = [(X, Y, Z) for X, Y, Z in old_list if Y == 'Plot']
    list2 = [(X, Y, Z) for X, Y, Z in old_list if Y == 'unPlot']
    

    If you want to traverse the input list only once, then maybe:

    def split_list(old_list):
        list1 = []
        list2 = []
        for X, Y, Z in old_list:
            if Y == 'Plot':
                list1.append((X, Y, Z))
            else:
                list2.append((X, Y, Z))
        return list1, list2
    
    0 讨论(0)
  • 2021-01-06 05:55
    data = [[8, "Plot", "Sunday"], [1, "unPlot", "Monday"], [12, "Plot", "Monday"], [10, "Plot", "Tuesday"], [4, "unPlot", "Tuesday"], [14, "Plot", "Wednesday"], [6, "unPlot", "Wednesday"], [1, "unPlot", "Thursday"], [19, "Plot", "Thursday"], [28, "Plot", "Friday"], [10, "unPlot", "Friday"], [3, "unPlot", "Saturday"]]
    
    res = {'Plot':[],'unPlot':[]}
    for i in data: res[i[1]].append(i)
    

    This way you iterate the list once

    0 讨论(0)
  • 2021-01-06 05:56

    Use list comprehension:

    l = [[8, "Plot", "Sunday"], [1, "unPlot", "Monday"], [12, "Plot", "Monday"], [10, "Plot", "Tuesday"], [4, "unPlot", "Tuesday"], [14, "Plot", "Wednesday"], [6, "unPlot", "Wednesday"], [1, "unPlot", "Thursday"], [19, "Plot", "Thursday"], [28, "Plot", "Friday"], [10, "unPlot", "Friday"], [3, "unPlot", "Saturday"]]
    
    list1 = [x for x in l if x[1] == "Plot"]
    
    list2 = [x for x in l if x[1] == "unPlot"]
    
    0 讨论(0)
提交回复
热议问题