How can I find same values in a list and group together a new list?

后端 未结 6 1608
感情败类
感情败类 2020-12-03 07:11

From this list:

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]

I\'m trying to create:

L = [[1],[2,2],[3,3,3],[4,4,4,4],[5,5,5,5,5]]


        
相关标签:
6条回答
  • 2020-12-03 08:01

    You're overcomplicating this.

    What you want to do is: for each value, if it's the same as the last value, just append it to the list of last values; otherwise, create a new list. You can translate that English directly to Python:

    new_list = []
    for value in old_list:
        if new_list and new_list[-1][0] == value:
            new_list[-1].append(value)
        else:
            new_list.append([value])
    

    There are even simpler ways to do this if you're willing to get a bit more abstract, e.g., by using the grouping functions in itertools. But this should be easy to understand.


    If you really need to do this with a while loop, you can translate any for loop into a while loop like this:

    for value in iterable:
        do_stuff(value)
    
    iterator = iter(iterable)
    while True:
        try:
            value = next(iterator)
        except StopIteration:
            break
        do_stuff(value)
    

    Or, if you know the iterable is a sequence, you can use a slightly simpler while loop:

    index = 0
    while index < len(sequence):
        value = sequence[index]
        do_stuff(value)
        index += 1
    

    But both of these make your code less readable, less Pythonic, more complicated, less efficient, easier to get wrong, etc.

    0 讨论(0)
  • 2020-12-03 08:01

    Another slightly different solution that doesn't rely on itertools:

    #!/usr/bin/env python
    
    def group(items):
        """
        groups a sorted list of integers into sublists based on the integer key
        """
        if len(items) == 0:
            return []
    
        grouped_items = []
        prev_item, rest_items = items[0], items[1:]
    
        subgroup = [prev_item]
        for item in rest_items:
            if item != prev_item:
                grouped_items.append(subgroup)
                subgroup = []
            subgroup.append(item)
            prev_item = item
    
        grouped_items.append(subgroup)
        return grouped_items
    
    print group([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
    # [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]
    
    0 讨论(0)
  • 2020-12-03 08:03

    You can use itertools.groupby along with a list comprehension

    >>> l =  [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
    >>> [list(v) for k,v in itertools.groupby(l)]
    [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]
    

    This can be assigned to the variable L as in

    L = [list(v) for k,v in itertools.groupby(l)]
    
    0 讨论(0)
  • 2020-12-03 08:05

    Someone mentions for N=[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 1] it will get [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5], [1]]

    In other words, when numbers of the list isn't in order or it is a mess list, it's not available.

    So I have better answer to solve this problem.

    from collections import Counter
    
    N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
    C = Counter(N)
    
    print [ [k,]*v for k,v in C.items()]
    
    0 讨论(0)
  • 2020-12-03 08:07

    Use itertools.groupby:

    from itertools import groupby
    
    N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
    
    print([list(j) for i, j in groupby(N)])
    

    Output:

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

    Side note: Prevent from using global variable when you don't need to.

    0 讨论(0)
  • 2020-12-03 08:14

    You can do that using numpy too:

    import numpy as np
    
    N = np.array([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
    counter = np.arange(1, np.alen(N))
    L = np.split(N, counter[N[1:]!=N[:-1]])
    

    The advantage of this method is when you have another list which is related to N and you want to split it in the same way.

    0 讨论(0)
提交回复
热议问题