una txt tuplas tupla partir listas lista guardar crear convertir como buscar archivos archivo anidadas acceder python csv dictionary tuples

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)