txt - listas anidadas python
Conversión de un archivo csv en una lista de tuplas con python (2)
Tengo que tomar una csv con 4 columnas: marca, precio, peso y tipo.
Los tipos son naranja, manzana, pera, ciruela.
Parámetros: necesito seleccionar el peso más posible, pero seleccionando 1 naranja, 2 peras, 3 manzanas y 1 ciruela por no exceder el presupuesto de $ 20. No puedo repetir las marcas de la misma fruta (como seleccionar la misma marca de manzana 3 veces, etc.).
Puedo abrir y leer el archivo csv a través de Python, pero no estoy seguro de cómo crear un diccionario o una lista de tuplas del archivo csv.
Para mayor claridad, aquí hay una idea de los datos.
Brand, Price, Weight, Type
brand1, 6.05, 3.2, orange
brand2, 8.05, 5.2, orange
brand3, 6.54, 4.2, orange
brand1, 6.05, 3.2, pear
brand2, 7.05, 3.6, pear
brand3, 7.45, 3.9, pear
brand1, 5.45, 2.7, apple
brand2, 6.05, 3.2, apple
brand3, 6.43, 3.5, apple
brand4, 7.05, 3.9, apple
brand1, 8.05, 4.2, plum
brand2, 3.05, 2.2, plum
Aquí está todo lo que tengo en este momento:
import csv
test_file = ''testallpos.csv''
csv_file = csv.DictReader(open(test_file, ''rb''), ["brand"], ["price"], ["weight"], ["type"])
Puedes reflexionar sobre esto:
import csv
def fitem(item):
item=item.strip()
try:
item=float(item)
except ValueError:
pass
return item
with open(''/tmp/test.csv'', ''r'') as csvin:
reader=csv.DictReader(csvin)
data={k.strip():[fitem(v)] for k,v in reader.next().items()}
for line in reader:
for k,v in line.items():
k=k.strip()
data[k].append(fitem(v))
print data
Huellas dactilares:
{''Price'': [6.05, 8.05, 6.54, 6.05, 7.05, 7.45, 5.45, 6.05, 6.43, 7.05, 8.05, 3.05],
''Type'': [''orange'', ''orange'', ''orange'', ''pear'', ''pear'', ''pear'', ''apple'', ''apple'', ''apple'', ''apple'', ''plum'', ''plum''],
''Brand'': [''brand1'', ''brand2'', ''brand3'', ''brand1'', ''brand2'', ''brand3'', ''brand1'', ''brand2'', ''brand3'', ''brand4'', ''brand1'', ''brand2''],
''Weight'': [3.2, 5.2, 4.2, 3.2, 3.6, 3.9, 2.7, 3.2, 3.5, 3.9, 4.2, 2.2]}
Si desea el archivo csv literalmente como tuplas por filas:
import csv
with open(''/tmp/test.csv'') as f:
data=[tuple(line) for line in csv.reader(f)]
print data
# [(''Brand'', '' Price'', '' Weight'', '' Type''), (''brand1'', '' 6.05'', '' 3.2'', '' orange''), (''brand2'', '' 8.05'', '' 5.2'', '' orange''), (''brand3'', '' 6.54'', '' 4.2'', '' orange''), (''brand1'', '' 6.05'', '' 3.2'', '' pear''), (''brand2'', '' 7.05'', '' 3.6'', '' pear''), (''brand3'', '' 7.45'', '' 3.9'', '' pear''), (''brand1'', '' 5.45'', '' 2.7'', '' apple''), (''brand2'', '' 6.05'', '' 3.2'', '' apple''), (''brand3'', '' 6.43'', '' 3.5'', '' apple''), (''brand4'', '' 7.05'', '' 3.9'', '' apple''), (''brand1'', '' 8.05'', '' 4.2'', '' plum''), (''brand2'', '' 3.05'', '' 2.2'', '' plum'')]
import csv
with open("some.csv") as f:
r = csv.reader(f)
print filter(None,r)
o con lista de comprensión
import csv
with open("some.csv") as f:
r = csv.reader(f)
print [row for row in r if row]
para comparacion
In [3]: N = 100000
In [4]: the_list = [randint(0,3) for _ in range(N)]
In [5]: %timeit filter(None,the_list)
1000 loops, best of 3: 1.91 ms per loop
In [6]: %timeit [i for i in the_list if i]
100 loops, best of 3: 4.01 ms per loop
[edit] dado que tu salida real no tiene espacios en blanco, no necesitas la lista de comprensión o el filtro, puedes decir list(r)
Respuesta final sin líneas en blanco
import csv
with open("some.csv") as f:
print list(csv.reader(f))
si quieres dicts puedes hacer
import csv
with open("some.csv") as f:
reader = list(csv.reader(f))
print [dict(zip(reader[0],x)) for x in reader]
#or
print map(lambda x:dict(zip(reader[0],x)), reader)