Ver Mensaje Individual
  #17  
Antiguo 11-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Reputación: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
A modo comparativo, lo mismo, con python

NOTA: Para hacer llamadas a lineas de comandos, se usa subprocess, o os.popen, pero dio la casualidad que "history" es un comando desactivado sino se esta en modo interactivo, osea, es dificil de hacerle programacion. Normalmente uno haria:

Código PHP:
import os

resultado
=os.popen("ls").read()

print 
resultado 
Pero "history" es un maldito que no se deja asi. Una fregada del bash.

Asi que uno puede hacer:

Código PHP:
history resultado.txt 
Para tener el resultado en un archivo de texto. Desde ahi, entrar a python y:

1. Cargar el archivo, separado por lineas, en una estructura de lista:

Código PHP:
lineas open('resultado.txt').readlines() 
Una lista se lee asi:

http://effbot.org/zone/python-list.htm

2. Ahora le mochamos los numeros y dejamos los comandos. La solucion "simple" es partir cada linea y construir otra lista

Le hago trim a cada linea, parto con split (por defecto parte por 1 espacio), y cojo el segundo resultado (split devuelve otra lista asi: ['1','comando'])

Código PHP:
comandos = [linea.strip().split()[1] for linea in lineas
Código:
> print comandos[:5]
>>> ['ls', 'chflags', 'ls', 'python', 'easy_install']
3. Ahora viene la parte de "conocer realmente python" o tambien llamada " usar google". Como se cuantas veces cada item de la lista se repite? El algoritmo es facil de armar, pero la idea que llevo es hacer lo mismo, con comandos de pocas lineas. Pero con python, las baterias estan incluidas!:

collections.Counter me devuelve un diccionario, con llave= comando, valor = cuantas veces se repite

Código PHP:
import collections

rank
=collections.Counter(comandos
Y ahora como ordenarlo. Otro algoritmo facil a punta de ciclos FOR, pero que carajos, python tiene baterias incluidas, asi que googleando:

Código PHP:
from operator import itemgetter

ordenado 
sorted(rank.items(), key=itemgetter(1)) 
Esto me ordena usando una funcion de ordenacion, enviada como parametro de comparacion (un truco de programacion funcional, creo que ya es mas conocido). Esto me ordena de menor a mayor. Como obtengo los mas usados? Lo puede reversar, y sacar los primeros (tail)

Código PHP:
ordenado.reverse()

print 
ordenado[:10]
>> [(
'hg'988),
 (
'cd'709),
 (
'sudo'648),
 (
'st'430),
 (
'ls'354),
 (
'ci'275),
 (
'python'223),
 (
'push'212),
 (
'clear;'188),
 (
'heroku'182)] 

Lo que me gusta de hacerlo con python, a pesar de que igual hay que aprender del lenguaje y las librerias (y que ciertas cosas obviamente sale mejor o mas rapido directamente por comandos establecidos) es que puedo interactuar con los datos. En cualquier momento, doy un print, saco los 10 primeros de la lista, le hago un for, etc... es mucho mas practico en muchos casos.

La otra razon, es que python se puede resumir en: Maneja lista, maneja diccionario. Practicamente todo devuelve listas y diccionarios. Es mucho mas intuitivo que operar siempre con cadenas y switches, y mas facil de operar. Es algo que se vuelve obvio cuando se entra a linea de comandos interactivo de python y se hacen las llamadas a las funciones: listas, diccionarios, todo el tiempo. Es muy practico!
__________________
El malabarista.
Responder Con Cita