2011-12-24 10 views
7

La comprensione delle liste è molto buona. Ma una sorta di "... Unisciti ..." sarebbe molto utile. Grazie. Quindi per esempio. Ho un Set A = {1,0}, un elenco B = [[1,1], [2,3]]. Mi piacerebbe trovare tutte le righe in B in cui il secondo colomu è uno dei valori in A. O qualche cosa più generale, ho 2 file CSV. Voglio scoprire tutte le righe in cui i valori di alcune colonm dei due file corrispondono. Proprio come una sorta di "join" di due file. Uno dei file è la dimensione GB. sqldf is "SQL select on R data frames."Esiste un modulo in Python che faccia qualcosa come "sqldf" per R?

+3

Si otterrebbe più risposte/meglio se si dispone di una breve riassunto di cosa 'sqldf' fa per gli utenti non-R. Esattamente quali parti della sua funzionalità vuoi? –

+1

Concordato ... Inoltre, qualche codice o almeno qualche pseudo codice per spiegare cosa si sta tentando di fare sarebbe utile. –

risposta

4

Sono a conoscenza di una libreria di fare ciò che si chiede (ma mi guardò solo la documentazione sqldf), ma niente di quello che hai chiesto richiede davvero una biblioteca, sono one-liner in pitone (e si potrebbe ovviamente astratto la funzionalità creando una funzione piuttosto che una semplice comprensione di lista ...)

Set A = {1,0}, un elenco B = [[1,1], [2,3]] . Mi piacerebbe trovare tutte le righe in B, dove la seconda colonna è uno dei valori in A.

>>> a = set([1, 0]) 
>>> b = [[1,1],[2,3]] 
>>> [l for l in b if l[1] in a] 
[[1, 1]] 

Ho 2 file CSV. Voglio scoprire tutte le righe in cui i valori di alcune colonne dei due file corrispondono.

>>> f1 = [[1, 2, 3], [4, 5, 6]] 
>>> f2 = [[0, 2, 8], [7, 7, 7]] 
>>> [tuple_ for tuple_ in zip(f1, f2) if tuple_[0][1] == tuple_[1][1]] 
[([1, 2, 3], [0, 2, 8])] 

EDIT: Se l'utilizzo della memoria è un problema che si dovrebbe usare generatori invece di liste. Per esempio:

>>> zip(f1, f2) 
[([1, 2, 3], [0, 2, 8]), ([4, 5, 6], [7, 7, 7])] 

ma utilizzando generatori:

>>> import itertools as it 
>>> gen = it.izip(f1, f2) 
>>> gen 
<itertools.izip object at 0x1f24ab8> 
>>> next(gen) 
([1, 2, 3], [0, 2, 8]) 
>>> next(gen) 
([4, 5, 6], [7, 7, 7]) 

E per l'origine dati:

>>> [line for line in f1] 
[[1, 2, 3], [4, 5, 6]] 

tradurre come generatore come:

>>> gen = (line for line in f1) 
>>> gen 
<generator object <genexpr> at 0x1f159b0> 
>>> next(gen) 
[1, 2, 3] 
>>> next(gen) 
[4, 5, 6] 
+0

Grazie a @mac. Hai ragione, la comprensione delle liste è altrettanto potente di SQL, se non hai a che fare con i file di grandi dimensioni che non possono essere letti in memoria una sola volta. Sarò molto felice se faccio lo stesso con grandi file CSV. – gstar2002

+0

@ gstar2002 - Non c'è nulla che ti impedisca di usare questa sintassi con i generatori anziché con gli elenchi. Vedi le modifiche. – mac

+0

grazie, funziona per izip. Ma per cose come ([l1, l2] per l1 in f1 per l2 in f2), non funziona. Ho solo la prima riga di f1 combinata con tutte le linee da f2. Ma mi piacerebbe avere tutte le combinazioni. – gstar2002

Problemi correlati