2015-06-29 4 views
1

Я хочу заполнить list_of_occurences правильным товаром из списка grundformen.My for-Loop не работает должным образом

My for-loop не работает должным образом. Он не перезапускается с самого начала и только проходит через строки в считывателе один раз. Поэтому он не будет заполнять список полностью.

Это то, что он печатает (вы можете увидеть ту часть, где-то не хватает - потому что не начинает поиск с начала списка -):

# List_of_occurrences (1 line - wrapped for easier reading) 
[['NN', 1328, ('Ziel',)], ['ART', 771, ('der',)], 
['$.', 732, ('_',)], ['VVFIN', 682, ('schlagen',)], 
['PPER', 592, ('sie',)], ['$,', 561, ('_',)], 
['ADV', 525, ('So',)], ['APPR', 507, ('in',)], 
['NE', 433, ('Johanna',)], ['$(', 363, ('_',)], 
['VAFIN', 334, ('haben',)], ['ADJA', 307, ('tragisch',)], 
['ADJD', 278, ('recht',)], ['KON', 228, ('Doch',)], 
['VVPP', 194, ('reichen',)], ['VVINF', 161, ('stören',)], 
['KOUS', 151, ('Während',)], ['PPOSAT', 120, ('ihr',)], 
['PTKVZ', 104, ('weiter',)], ['PRF', 98, ('sich',)], 
['APPRART', 90, ('zu',)], ['PTKNEG', 87, ('nicht',)], 
['VMFIN', 76, ('sollen',)], ['PIAT', 66, ('kein',)], 
['PIS', 65, ('etwas',)], ['PTKZU', 52, ('zu',)], 
['PRELS', 51, ('wer',)], ['PROAV', 42, ('dabei',)], 
['PDS', 38, ('jener',)], ['PDAT', 37, ('dieser',)], 
['PWAV', 30, ('wie',)], ['PWS', 26, ('Was',)], 
['CARD', 24, ('drei',)], ['KOKOM', 21, ('wie',)], 
['VAINF', 18, ('werden',)], ['KOUI', 15, ('um',)], 
['VMINF', 10, ('können',)], ['VVIZU', 10, ('aufklären',)], 
['VAPP', 10], ['PTKA', 6], ['PTKANT', 6], ['PWAT', 4], 
['VVIMP', 4], ['PRELAT', 4], ['APZR', 3], ['APPO', 2], 
['FM', 1]] 

# Grundformen (1 line, wrapped for reading) 
['Ziel', 'der', '_', 'schlagen', 'sie', '_', 'So', 'in', 'Johanna', 
'_', 'haben', 'tragisch', 'recht', 'Doch', 'reichen', 'stören', 
'Während', 'ihr', 'weiter', 'sich', 'zu', 'nicht', 'sollen', 'kein', 
'etwas', 'zu', 'wer', 'dabei', 'jener', 'dieser', 'wie', 'Was', 
'drei', 'wie', 'werden', 'um', 'können', 'aufklären'] 

occurences = collections.Counter() 

with open("material-2.csv", mode='r', newline='', encoding="utf-8") as material: 
    reader = csv.reader(material, delimiter='\t', quotechar="\t") 
    for line in reader: 
     if line: 
      occurences[line[5]] += 1 
     else: 
      pass 

list_of_occurences = [list(elem) for elem in occurences.most_common()] 

grundformen = [] 
with open('material-2.csv', mode='r', newline='', encoding="utf-8") as material: 
    reader = csv.reader(material, delimiter='\t', quotechar="\t") 
    for elem in list_of_occurences: 
     for row in reader: 
      if row != [] and row[5] == elem[0]: 
       grundformen.append(row[2]) 
       break 

iterator = 0 
for elem in grundformen: 
    list_of_occurences[iterator].insert(2, elem) 
    iterator = iterator + 1 
    pass 

print(list_of_occurences) 
print(grundformen) 

весь входной_файл: https://www.dropbox.com/sh/xyktjk4ycm8x6v0/AACou438_eEWx-ZYmByBiqp_a/material-2.csv?dl=0

Часть моего входного файла:

1 Als Als _ _ KOUS _ _ 6 6 CP CP _ _ 2 es es _ _ PPER _ 3 | Nom | Sg | Neut 6 6 SB SB _ _ 3 zu zu _ _ PTKA _ _ 4 4 MO MO _ _ 4 schneien schneien _ _ ADJD _ Comp | Dat | Sg | Fem 5 5 MO MO _ _ 5 aufgehört aufhören _ _ VVPP _ Psp 6 6 OC OC _ _ 6 hatte haben _ _ VAFIN _ 3 | Sg | Прошлое | Индекс 8 8 MO MO _ _ 7, _ _ _ $, _ _ 8 8 PUNC PUNC _ _ 8 verließ verlassen _ _ VVFIN _ 3 | Sg | Past | Ind 0 0 ROOT ROOT _ _ 9 Johanna Johanna _ _ NE _ Nom | Sg | Masc 8 8 SB SB _ _ 10 von von _ _ APPR _ _ 5 5 SBP SBP _ _ 11 Rotenhoff Rotenhoff _ _ NE _ Dat | Sg | Neut 10 10 NK NK _ _ 12, _ _ _ $, _ _ 8 8 PUNC PUNC _ _ 13 ohne ohne _ _ KOUI _ _ 18 18 CP CP _ _ 14 ein ein _ _ ART _ Nom | Sg | Neut 16 16 NK NK _ _ 15 rechtes recht _ _ ADJA _ Pos | Nom | Sg | Neut 16 16 NK NK _ _ 16 Ziel Ziel _ _ NN _ Nom | Sg | Neut 18 18 OA OA _ _ 17 zu zu _ _ PTKZU _ _ 18 18 PM PM _ _ 18 haben haben _ _ VAINF _ Inf 8 8 MO MO _ _ 19, _ _ _ $, _ _ 18 18 PUNC PUNC _ _ 20 das der _ _ ART _ Nom | Sg | Neut 21 21 NK NK _ _ 21 Gutshaus Gutshaus _ _ NN _ Nom | Sg | Neut 16 16 APP APP _ _ 22. _ _ _ $. _ _ 8 8 PUNC PUNC _ _

Как я могу изменить свою петлю, чтобы она могла заполнить все?

+0

Какие результаты вы ожидали? – tijko

+0

Как вы можете видеть в моих 2 списках в начале, он перестает заполнять слова после: ['VVIZU', 10, ('aufklären',)], Это пустое: ['VAPP', 10], [' PTKA ', 6], [' PTKANT ', 6], [' PWAT ', 4], [' VVIMP ', 4], [' PRELAT ', 4], [' APZR ', 3], [' APPO ' , 2], ['FM', 1]] Что говорит, что мой for-loop работает только до определенной точки и не перезапускается снова, чтобы получить недостающие слова (которые затем будут заполнены пробелами) – GG3

+0

Я хочу, чтобы каждый в тесте list_of_occurences, который будет сравниваться с речевым сигналом в каждой строке читателя. Если оба они совпадают, я хочу, чтобы строка строк [2] была добавлена ​​в список «grundformen». Для этого я написал цикл for, который выполняет итерацию через list_of_occurences и вложенную, которая проходит через каждую строку до тех пор, пока они не совпадут. Мне нужно только одно примерное слово для каждого Part-Of-Speech-Tag, поэтому я использовал break, но это заставляет цикл не начинать снова с самого начала, в результате чего не найти примерное слово для последних нескольких речевых тегов – GG3

ответ

0

У вас возникла проблема с тем, как вы читали данные csv.

Здесь данные считываются в list и может быть пройден за второй цикл вместо открытия другого file-object, но вы даже не нужно перебрать данные csv дважды:

import csv 
import collections 

occurences = collections.Counter() 
grundformen = collections.defaultdict(list) 

with open("material-2.csv", mode='r', newline='', encoding="utf-8") as material: 
    reader = [ln for ln in csv.reader(material, delimiter='\t', quotechar="\t") if ln] 
    for line in reader: 
     occurences[line[5]] += 1 
     grundformen[line[5]].append(line[2]) 
    list_of_occurences = list(map(list, occurences.most_common())) 
    for elem in list_of_occurences: 
     elem.append(grundformen[elem[0]][0]) 

print(occurences) 

Делая a list из ваших данных csv, вы можете вызвать оператор break и все еще иметь возможность запустить новый в начале list для следующего цикла.Когда вы перебираете csv.reader, это iterator, поэтому даже при вызове break вы начнете с того места, где вы остановились, пока его данные не будут исчерпаны.

+0

Большое спасибо. – GG3

1
reader = csv.reader(material, delimiter='\t', quotechar="\t") 

Установка катчара такая же, как и разделитель, выглядит довольно странно. Считыватель CSV, вероятно, запутается и возьмет либо все вкладки (\t) в качестве разделителей, либо интерпретирует их как кавычки.

+0

Изменение этого или удаления разделителя дает мне следующую ошибку: if row! = [] И row [5] == elem [0]: IndexError: индекс списка за пределами допустимого диапазона – GG3

+1

Можете ли вы показать нам (изменить вопрос или предоставить ссылка) на входной файл (материал-2.csv)? Если слишком долго, может быть, выдержка из файла? У меня создалось впечатление, что проблема в чтении файла. – jcoppens

+0

@jcoppens «читателю» необходимо установить «последовательность». – tijko

Смежные вопросы