Python - identificar el numero que es menos común en la lista

 
Vista:
sin imagen de perfil

identificar el numero que es menos común en la lista

Publicado por Blue (2 intervenciones) el 03/12/2017 19:47:24
Dada una lista de números, en el que cada numero puede aparecer varias veces el objetivo es identificar el numero que es menos común en la lista. Si hubiera diferentes números con la misma frecuencia el resultado seria el ultimo de la lista. (Sin orden)
-Haz el primer boceto para resolver el algoritmo
-Resuelve el algoritmo en python3
-Ahora con orden ascendente en los números


Estaria muuuuuy agradecida si alguien me pudiera ayudar, se que es algo facilísimo pero como he dicho soy una novata.
Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de abzerox
Val: 425
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

identificar el numero que es menos común en la lista

Publicado por abzerox (109 intervenciones) el 04/12/2017 05:16:46
Hola Blue, existen varias soluciones para resolver lo que planteas debajo te comparto dos, quizas no sean las mejores pero cumplen con el objetivo. La primer de ellas es más recomendable si recien te estan iniciando en python (es un poco más extensa pero te ayudara a entender la logica aplicada), en la segunda solución me apoyo en algunos modulos de Python de los cuales te dejo las referencias, ya que el objetivo es que lo entiendas, estudies y modifiques a tu gusto.
Los comentarios en el código explican el paso a paso del algoritmo, si no entiendes algo comentanos.

Solución 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
numbers = [1, 9, 8, 5, 4, 2, 3, 6, 1, 3, 6, 7, 7, 1, 4, 2, 5, 6, 8, 9]
repetitions = {}
 
# Itero sobre la lista, comprobando en primer lugar si el el número no esta el diccionario, es decir, no es 
# una key de este. De ser así genero una nueva key en el diccionario con valor inicial de 1.
# Caso contrario, si la clave existe simplemente incremento en 1 su valor.
for i in numbers:
  if i not in repetitions:
    repetitions = 1
  else:
    repetitions += 1
 
if len(repetitions):
  # dict.items() View object
  # Utilzo un iterador para obtener uno a uno los elementos devueltos por el objeto DictView.
  items = iter(repetitions.items())
  # Recupero el primer elemento del DictView, el cual lo considero como el de menor repeticiones.
  # DictView retorna una tupla del orden (número, cantidad).
  first_item = next(items)
  number = first_item[0]
  quantity = first_item[1]
 
  for i, v in repetitions.items():
    # Si el valor 'v' es menor a la cantidad 'quantity' actualmente menor, o la cantidad de repeticiones son
    # iguales y la posición (index) del elemento en la lista 'numbers' es mayor 
    # se considera como el número con menor repeticiones.
    # IMPORTANTE: Debido a que la lista no esta ordenada, debemos tenero en cuenta que el método index() 
    # retorna el indice de la PRIMERA OCURRENCIA, es decir si tenemos la lista anterior y buscamos 
    # el indice del elemento 5 devolvera 3 aunque exista otro número 5 en la lista.
    if v < quantity or (v == quantity and numbers.index(i) > numbers.index(quantity)):
      number = i
      quantity = v
 
  print('El número con menor repetición es : {} con {} repeticiones '.format(number, quantity))

Solucón 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from collections import Counter
from operator import itemgetter
 
numbers = [1, 9, 8, 5, 4, 2, 3, 6, 1, 3, 6, 7, 7, 1, 4, 2, 5, 6, 8, 9]
repetitions = Counter(numbers)
items = iter(sorted(repetitions.most_common(), key=itemgetter(1)))
first_item = next(items)
number = first_item[0]
quantity = first_item[1]
for i, v in items:
  if v < quantity or (v == quantity and numbers.index(i) > numbers.index(quantity)):
    number = i
    quantity = v
 
print('El número con menor repetición es : {} con {} repeticiones '.format(number, quantity))

En el caso de que la lista este ordenada deberiamos realizar un pequeño cambio en la siguiente linea:

Cambiar:
1
if v < quantity or (v == quantity and numbers.index(i) > numbers.index(quantity)):

Por:
1
if v < quantity or (v == quantity and i > number):

Referencias:
Counter : https://docs.python.org/3/library/collections.html#collections.Counter
operator: https://docs.python.org/3/library/operator.html
iter: https://docs.python.org/3.6/library/functions.html#iter
[i]next
: https://docs.python.org/3.6/library/functions.html#next
[i]DictViews
: https://docs.python.org/3.3/library/stdtypes.html#dict-views
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

identificar el numero que es menos común en la lista

Publicado por noemi (2 intervenciones) el 04/12/2017 13:00:39
Muchísimas gracias abzerox por tomarte el tiempo para ayudarme con este problema, estoy iniciándome en python y programación en general y tu solución y explicaciones me han ayudado mucho.
Gracias de nuevo! No conocía la pagina Python Software Foundation pero definitivamente voy a echarle un vistazo porque parece ser una gran ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar