Operazione con due liste

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Operazione con due liste

Messaggio da cloudany »

CIao a tutti ragazzi ho un problemino tecnico.
Il mio programma esegue un calcolo fra gli elementi presenti all'interno due file.
Vi spiego con un esempio il mio problema:
ho due liste identiche di nomi files (nome_a = file_a):
nome_a nome_a
nome_b nome_b
nome_c nome_c

prendo nome_a ed eseguo il calcolo:
nome_a vs nome_a
nome_a vs nome_b
nome_a vs nome_c

poi prendo:
nome_b vs nome_a
nome_b vs nome_b
nome_c vs nome_c

Il mio problema è che non voglio che il nome_a e nome_b vengano confrontati una seconda volta perchè A vs B == B vs A per cui mi basta calcolarlo una sola volta, questo ovviamente per ogni nome che ho.

Il mio codice è questo:

Codice: Seleziona tutto

#! /usr/bin/python
import csv
import numpy

numpy.seterr(divide='ignore', invalid='ignore')

bacteria = csv.reader(open('bacteria_names.csv', 'rb'))
name = []

bacteria_next = csv.reader(open('bacteria_names_next.csv', 'rb'))
name_next = []

for row in bacteria:
        name.append(row[0])

for row_next in bacteria_next:
        name_next.append(row_next[0])

ofile  = open('/home/daniele/Documents/Universita/Magistrale/Modelli_di_Calcolo_naturale/Project/NEW_ANALISYS/Bacteria/heatmap_bacteria.csv', "wb")

for n in name:
    data_1 = csv.reader(open(n+'_min_avg_max.csv', 'rb'), delimiter="\t")
    column1_data_1, column2_data_1, column3_data_1 = [], [], []

    for row in data_1:
        column1_data_1.append(row[1])
        column2_data_1.append(row[2])
        column3_data_1.append(row[3])

    column_min_data_1 = map(float, column1_data_1)
    column_avg_data_1 = map(float, column2_data_1)
    column_max_data_1 = map(float, column3_data_1)

    for j in name_next:
        data_2 = csv.reader(open(j+'_min_avg_max.csv', 'rb'), delimiter="\t")
        column1_data_2, column2_data_2, column3_data_2 = [], [], []

        for row_next in data_2:
            column1_data_2.append(row_next[1])
            column2_data_2.append(row_next[2])
            column3_data_2.append(row_next[3])

            column_min_data_2 = map(float, column1_data_2)
            column_avg_data_2 = map(float, column2_data_2)
            column_max_data_2 = map(float, column3_data_2)

        print n + ' vs ' + j
        min_heat = numpy.asarray(numpy.corrcoef(column_min_data_1, column_min_data_2))[0, 1]
        avg_heat = numpy.asarray(numpy.corrcoef(column_avg_data_1, column_avg_data_2))[0, 1]
        max_heat = numpy.asarray(numpy.corrcoef(column_max_data_1, column_max_data_2))[0, 1]

        writer = csv.writer(ofile, delimiter='\t')
        writer.writerow([n+' vs '+j, min_heat, avg_heat, max_heat])

ofile.close()
Come posso fare per risolvere il problema? C'è un modo per migliorare l'algoritmo oppure con bash posso risolvere il problema?
Grazie mille
" 4 letters are enough to explain mankind"
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Operazione con due liste

Messaggio da cloudany »

Ok forse ho trovato una soluzione, almeno concettualmente:
posso iterare su una sola lista (dato che sono identiche) con due for annidati:

Codice: Seleziona tutto

for i in names:
  for in names[i]:
     exec()....
il problema però è che facendo così ottengo:
ValueError: invalid literal for int() with base 10
Poichè sono file che contengono stringhe....

Come faccio in python ad ottenere l'indice della lista "name" nel primo for?

-------------------EDIT
ho provato così:

Codice: Seleziona tutto

for i in name:
    x = name.index(i)
    for x in name:
        print (i+" vs "+x)
Purtroppo non sortisce alcun effetto, voglio che il secondo for parta dall'indice del primo cioè:
Ho questa situazione:

Codice: Seleziona tutto

list 1   list 2
a           a
b <-      b<-
c           c
L' iteratore n°2 parta sempre dall'indice del 1°

EDIT3------------
Trovato!
bastava fare così:

Codice: Seleziona tutto

for i in list1:
  x = list1.index(i)
  for x in list1[x:]:
 # do stuff
Grazie a tutti lo stesso =)
" 4 letters are enough to explain mankind"
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Operazione con due liste

Messaggio da crap0101 »

per avere comodamente le combinazioni (con o senza ripetizioni, permutazioni, ecc) guarda il modulo itertools.
Già che ci sono (dato che il codice mi sembra quello dell'altra discussione a cui non avevo ancora risposto) scrivo qui un paio di commenti: se usi numpy puoi evitare il modulo csv e invece caricare direttamente i dati (csv o simil-csv) in una numpy.matrix, col vantaggio che è molto più comodo da gestire e gli puoi indicare - se li conosci a priori - i tipi di dati che l'input contiene, per cui della trasformazione se ne occuppa lui.
O comunque tienilo presente per il futuro se dovessi fare elaborazioni più complicate.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Operazione con due liste

Messaggio da cloudany »

Ciao caro, grazie mille per le dritte, si il codice è quello del passato thread solo con la pecca citata in questo post.
Non sapevo che numpy fosse così potente da "scavalcare" in parte CSV mi piace grazie!
" 4 letters are enough to explain mankind"
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti