python - Ordenar el diccionario de listas por pares de valores clave
python-3.x dictionary (3)
Puede aplanar el diccionario (
d
aquí) en una lista de tuplas con los pares
key/value
correspondientes, y ordenar las tuplas de acuerdo con los valores:
from operator import itemgetter
l = [(k,i) for k,v in d.items() for i in v]
# [(''fbi'', 229), (''fbi'', 421), (''fbi'', 586), (''fbi'', 654),...
list(zip(*sorted(l, key=itemgetter(1))[:3]))[0]
# (''hillary'', ''hillary'', ''fbi'')
Estoy tratando de ordenar los valores que están dentro de un diccionario de listas y crear una nueva lista a partir de ellos. Aquí están los datos:
{
''fbi'': [229, 421, 586, 654, 947, 955, 1095, 1294, 1467, 2423, 3063, 3478, 3617, 3730, 3848, 3959, 4018, 4136, 4297, 4435, 4635, 4679, 4738, 5116, 5211, 5330, 5698, 6107, 6792, 6906, 7036],
''comey'': [605, 756, 1388, 1439, 1593, 1810, 1959, 2123, 2506, 3037, 6848],
''hillary'': [14, 181, 449, 614, 704, 1079, 1250, 2484, 2534, 2659, 3233, 3374, 3488, 3565, 4076, 4756, 4865, 6125, 7109]
}
Lo que intento es encontrar los 20 valores más pequeños en estos y obtener una lista de sus claves correspondientes. Por ejemplo, los primeros tres valores mínimos son 14 (hillary), 181 (hillary) y 229 (fbi). Por lo tanto, ¿cómo puedo obtener una lista como esta?
[''hillary'', ''hillary'', ''fbi'']
Todos los valores siempre serán diferentes. Además, todos los valores de la lista están ordenados, de ascendente a descendente.
Esto es lo que he intentado:
for m in range(1,20):
for i in sort_vals.values():
if i[0] < a[0]:
a[0] = i[0]
Esto me da el menor valor, pero no otro, ya que después de una iteración, el menor valor es siempre el mismo. Supongo que si puedo eliminar ese valor en particular, será útil. No se me ocurre nada más. ¡Gracias!
Simplemente use la función lambda en sorted ().
l = [(k,i) for k,v in d.items() for i in v]
res = [v[0] for v in sorted(l, key=lambda x: x[1])][:20]
tú podrías
- invierta su mapeo, creando un diccionario con números => lista de nombres
- ordenar este diccionario (como tupla)
- elige los 3 primeros artículos
Me gusta esto:
import collections
d = collections.defaultdict(list)
data = {''fbi'': [229, 421, 586, 654, 947, 955, 1095, 1294, 1467, 2423, 3063, 3478, 3617, 3730, 3848, 3959, 4018, 4136, 4297, 4435, 4635, 4679, 4738, 5116, 5211, 5330, 5698, 6107, 6792, 6906, 7036], ''comey'': [605, 756, 1388, 1439, 1593, 1810, 1959, 2123, 2506, 3037, 6848], ''hillary'': [14, 181, 449, 614, 704, 1079, 1250, 2484, 2534, 2659, 3233, 3374, 3488, 3565, 4076, 4756, 4865, 6125, 7109]}
for k,vlist in data.items():
for v in vlist:
d[v].append(k)
result = [v[0] for k,v in sorted(d.items())[:3]]
print(result)
esto imprime:
[''hillary'', ''hillary'', ''fbi'']
tenga en cuenta que si hay varios nombres adjuntos a un valor, este código elegirá solo el primero (
v[0]
)