python - Comment trier une séquence de données en utilisant certaines données d'un tuple ou un certain ensemble de clés dans un dictionnaire?
黄舟
黄舟 2017-06-12 09:22:19
0
2
954

Supposons que de telles données soient obtenues grâce à une post-analyse de données brutes massives :

[(id,node,val)(id,node,val)...]
est un tuple d'identifiant utilisateur, de serveur et de valeur dans l'ordre, puis séparé en fonction du serveur, puis trié en fonction de la valeur taille, puis Écrire dans Excel.
Ou générer [{"id":xxx,"node":xxx,"val":xxx},{"id":xxx,"node":xxx,"val":xxx}...]
Si cela is Il n'existe qu'un ensemble de kv qui peuvent être triés par tri, mais les noms des nœuds sont désormais inconnus et ces noms de serveurs peuvent changer chaque jour. Après avoir obtenu ces données, comment puis-je séparer et trier les données en fonction du nom du serveur ?
Le principal problème ici est que le nom du nœud lui-même n'est pas fixe. Par exemple, vous créez d'abord n ​​listes et y mettez les données du même nœud, mais vous ne savez pas combien de listes créer. Et lors de l’écriture ultérieure des données traitées pour Excel, une boucle sera inévitablement utilisée.
Il s'agit d'un cycle dans un cycle, et le nom du nouveau groupe de données n'est certain ni après la classification des données, ni après leur organisation. Même l'utilisation de la commande exec ne peut pas répondre aux besoins

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(2)
过去多啦不再A梦
from collections import defaultdict

d = defaultdict(list)
data = [(id,node,val),(id,node,val)...]

# 按node进行分组
for x in data:
    d[x[1]].append(x)
    
# 将分组数据依次写入excel
for _, v in d.iteritems():
    # 排序
    tmp = sorted(v, key=lambda x: x["val"], reverse=True/False)
    # 写入excel
    write_to_excel(tmp)

De plus, vous pouvez réellement écrire toutes les données dans un fichier csv par identifiant, nœud, val
L'écriture d'un script shell via les outils de commande awk, uniq, sort et autres de Linux est également très rapide

De plus, la taille de vos données massives et leur ordre de grandeur ne sont pas clairs. Si la quantité de données est vraiment importante, il est possible que la mémoire du code python ci-dessus ne soit pas suffisante. par vous-même

我想大声告诉你

Si je comprends bien vos besoins, vous pouvez utiliser un dictionnaire. La clé du dictionnaire est le nom du nœud, et la valeur du dictionnaire est une liste composée d'éléments :

data = [{"id":xxx,"node":xxx,"val":xxx},{"id":xxx,"node":xxx,"val":xxx}...]

result = {}
for data_item in data:
    node_name = data_item["node"]
    if node_name in result.keys():
        result[node_name].append(data_item)
    else:
        result[node_name] = [data_item]

Ensuite, retirez la valeur de chaque élément du dictionnaire (c'est-à-dire la liste de données) en fonction de la clé (nom du serveur) et triez-la en ajoutant lambda pour la trier en fonction d'une certaine valeur dans chaque élément.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal