2015-10-10 3 views
3

Я использую CSV (csv_f), который в основном только одинарные кавычки, разделенные запятыми слова:Python - проблемы, связанные с возвращением в функции

'foo','bar','yada', 'foo' 
'test' 

Я стараюсь смотреть каждый из них в другом документе (csv_g), который выглядит следующим образом:

1 'foo' 
2 'bar' 
3 'something' 
4 'test' 

И использовать это для создания разреженных векторов формата

SparseVector(#lines in csv_g, [#s in first column of csv_g], [# of occurences of each in csv_f]) 

примеры Abov е будет выглядеть следующим образом:

(4, [1, 2], [2, 1]) 
(4, [4], [1]) 

Я жевал это на некоторое время и попытался несколько различных подходов, но все они не работают. Я даже не пытаюсь обрабатывать множество вхождений, например, «foo». Мой самый близкий подход был таким:

import csv 

f = open(r'/path/to/csv_f.txt') 
g = open(r'/path/to/csv_g.txt') 
csv_f = csv.reader(f) 
csv_g = csv.reader(g, delimiter=' ') 

def lookup(text): 
    for row_g in csv_g: 
     if row_g[1] == text: 
      return (row_g[0]) 
      break 

for row_f in csv_f: 
    positions = [] 
    counts = [] 
    size = len(row_f) 
    i=0 
    for i in range(size): 
     fword = row_f[i] 
     positions.append(lookup(fword)) 
     counts.append(1) 
    print(positions, counts) 

Запуск это было в результате:

[None, None, None, None] [1, 1, 1, 1] 
[None] [1] 

Я смущен, почему функция не возвращает None вместо спичек. Я думал, что это ударит по спине, вернет его и выйдет ...

Я также пробовал некоторые вложенные циклы, не определяя функцию поиска (я могу опубликовать эти попытки, если это поможет, пока я не хочу загромождать ваши экраны), но это тоже не работает. Я думаю, это может быть потому, что генераторы можно искать только один раз, но я не уверен.

Любые намеки на лучший подход для этого и почему возвращение не работает должным образом, было бы чрезвычайно оценено.

+2

Несколько советов: вы можете только прокручивать открытый файл csv один раз. Если вы снова пропустите его, он не будет итерации вообще. Таким образом, вы хотите разобрать весь файл 'csv_g' один раз, сначала, создавая его или что-то вроде этого. Затем вы смотрите на вещи в dict, итерации через 'csv_f'. Также попробуйте распечатать материал в различных местах (например, print row_g, напечатать текст), чтобы помочь вам отладить то, что происходит. – Claudiu

+0

'lookup' возвращает None, потому что вы ничего не согласны, добавили ли вы некоторые отпечатки, чтобы увидеть, что происходит в цикле? –

+0

Спасибо, оба! Клаудиу, я попробую это. Padriac, печатающие элементы из обоих csv возвращают те же цитируемые строки, когда я этого ожидаю, позвольте мне подумать над хорошим способом отредактировать сообщение выше, чтобы показать это. –

ответ

0

Я понял это, сделав то, что предложил Клаудиу и Падриак. Обновленный код:

import csv 

f = open(r'/path/to/csv_f.txt') 
g = open(r'/path/to/csv_g.txt') 
csv_f = csv.reader(f) 
csv_g = csv.reader(g, delimiter=' ') 

dict = [] 

for row_g in csv_g: 
    dict.append(row_g) 
for row_f in csv_f: 
    positions = [] 
    counts = [] 
    size = len(row_f) 
    i=0 
    while i<size: 
     fword = row_f[i] 
     for line in dict: 
      gword = line[1] 
      if fword == gword: 
       positions.append(line[0]) 
       counts.append(1) 
       break 
     i+=1 
    print(positions, counts) 

Я не знаю, почему функция поиска не получал матчи, но я просто счастлив, что я был в состоянии получить что-то работает, наконец!