come aggiungere numeri tra stringhe in una lista?

ho una lista mista con stringhe e int e devo arrivare alla somma dei numeri tra ogni stringa. idealmente il risultato finale sarebbe una lista di tuple dato che ogni stringa e i seguenti numeri appartengono insieme (quindi l’ordine è importante).

posso estrarre il numero con iterazione usando isinstance ma la lista reale è molto grande e a volte ho 1 o 2 numeri per ogni stringa.

my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7] ideal_output = [('a', 3) ('b', 3), ('h', 54), ('d', 4), (v, 27)]

EN From: How to add numbers between strings in a list?

More similar articles:

9 Comments

  1. ecco una soluzione utilizzando itertools.groupby:

    my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7]
    
    from itertools import groupby
    
    groups = groupby(my_list, key=type) # group-by the type of the value
    
    result = []
    for key, group in groups:
        string = next(group) # get the string first, we'll skip over it otherwise
        if key is str:
            _, values = next(groups) # move the generator forward to get to the numbers
            result.append((string, sum(values))) # sum up the numbers
    print(result)

    uscita::

    [('a', 3), ('b', 3), ('h', 54), ('d', 4), ('v', 27)]

    si suppone che ci sarà almeno un numero tra le stringhe. se non è possibile controllare il len di g e se questo è più di 1, aggiungere uno 0 per il valore del primo valore in g

    1. buona soluzione, ma i vostri nomi variabili di una sola lettera mi stanno uccidendo. e s = list(g)[0] possiamo semplificare a s = next(g).

  2. si può solo utilizzare iterazione semplice pure senza groupby, questo sarà un po ‘più veloce, perché fa solo un passaggio:

    my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7]
    new_list = []
    new_element = []
    for element in my_list:
        if isinstance(element, str):
            if new_element:
                new_list.append(tuple(new_element))
            new_element = [element, 0]
        else:
            new_element[1] += element
    if new_element:
        new_list.append(new_element)
    print(new_list)

    uscita::

    [('a', 3), ('b', 3), ('h', 54), ('d', 4), ('v', 27)]
  3. con funzione functools.reduce:

    from functools import reduce
    
    def accum(prev, curr):    # prev - previous item, curr - current item
        if prev == [] or isinstance(curr, str):
            prev.append((curr, 0))
        elif isinstance(curr, int):
            prev[-1] = (prev[-1][0], prev[-1][1] + curr)
        return prev
    
    my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7]
    res = reduce(accum, my_list, [])   # [] is initializer
    print(res)

    l’uscita:

    [('a', 3), ('b', 3), ('h', 54), ('d', 4), ('v', 27)]

Leave a Reply

Your email address will not be published. Required fields are marked *