Como llegar entrada / salida para cada elemento de una lista?

votos
3

Tengo esta lista:

myList = [a, a, a, b, b, a, c, c, b, a]

Quiero contar la entrada y la salida para cada artículo único.

Flujo de entrada de 'a' = número de apariciones = 5 (cuando una transición entre en 'a')

Caudal de salida de 'a' = número de diferentes caracteres después 'a' = 2 (cuando una transición salidas de 'a' a otro personaje)

Para la entrada tengo este y funciona:

myListDict = {}    
for item in myList:
    myListDict.setdefault(item, 0)
    myListDict[item] += 1

Pero no se sabe muy bien cómo hacer esto de una manera rápida y elegante para la salida, en una sola iteración general, si es posible.

Publicado el 14/09/2018 a las 10:27
por usuario
En otros idiomas...                            


3 respuestas

votos
1

Si desea calcular tanto la entrada y salida en una sola pasada, podría utilizar esta estructura:

from collections import Counter

last_char = None

my_list = "aaabbaccba"

inflow = Counter()
outflow = Counter()

for char in my_list:
    inflow[char] += 1
    if last_char and char != last_char:
        outflow[last_char] += 1
    last_char = char


print(inflow)
print(outflow)

Genera:

Counter({'a': 5, 'b': 3, 'c': 2})
Counter({'a': 2, 'b': 2, 'c': 1})

Tenga en cuenta que con el Counter, no es necesario setdefault.

Respondida el 14/09/2018 a las 10:44
fuente por usuario

votos
1

Yo uso itertools.groupbypara eliminar elementos idénticos sucesivos, y luego contar las transiciones de flujo de entrada. Para la salida, sólo tenemos que restar 1 al recuento de entrada para el último elemento de la lista.

from itertools import groupby
from collections import Counter

myList = ['a', 'a', 'a', 'b', 'b', 'a', 'c', 'c', 'b', 'a']

uniques = [key for key, g in groupby(myList)]  # ['a', 'b', 'a', 'c', 'b', 'a']
c = Counter(uniques)
inflow = dict(c)
c.update({myList[-1]: -1})  # No outflow for the last element
outflow = dict(c)

print(inflow)
# {'a': 3, 'b': 2, 'c': 1}

print(outflow)
# {'a': 2, 'b': 2, 'c': 1}
Respondida el 14/09/2018 a las 10:51
fuente por usuario

votos
1

El uso collections.Countery itertools.groupby:

from collections import Counter
from itertools import groupby

def in_out_flow(lst):
    in_flow = Counter(lst)
    out_flow = Counter(k for k, _ in groupby(lst))
    out_flow[lst[-1]] -= 1
    for k,v in in_flow.items():
      print('key: {}, in flow: {}, out flow: {}'.format(k, v, out_flow[k]))

Ejemplos:

in_out_flow(['a', 'a', 'a', 'b', 'b', 'a', 'c', 'c', 'b', 'a'])
print('##')
in_out_flow(['a', 'a', 'a', 'b', 'a', 'c', 'a', 'b'])

salidas:

key: a, in flow: 5, out flow: 2
key: b, in flow: 3, out flow: 2
key: c, in flow: 2, out flow: 1
##
key: a, in flow: 5, out flow: 3
key: b, in flow: 2, out flow: 1
key: c, in flow: 1, out flow: 1
Respondida el 14/09/2018 a las 10:52
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more