Maison > Questions et réponses > le corps du texte
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
过去多啦不再A梦2017-06-12 09:24:19
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
我想大声告诉你2017-06-12 09:24:19
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.