Еще раз, как заставить вложенные циклы работать в Python - PullRequest
0 голосов
/ 27 июня 2011

Может кто-нибудь помочь мне с этим вложенным циклом? у него та же проблема, что и у Петли не работают - Strings (Python) , но теперь он находится в классе csv, у которого нет функции csv.readline ().

import csv
import sys, re
import codecs
reload(sys)
sys.setdefaultencoding('utf-8')

reader = csv.reader(open("reference.txt"), delimiter = "\t")
reader2 = csv.reader(open("current.txt"), delimiter = "\t")

for line in reader:
    for line2 in reader2:
        if line[0] == line2[1]:
            print line2[0] + '\t' + line[0]
            print line[1]
        else:
            print line[0]
            print line[1]

Цель этого кода - проверить строки в ссылочном тексте (т. Е. Reader2), которые совпадают с текущим текстовым файлом (т. Е. Reader). А затем напечатайте серийный номер, который находится в reference.txt

reference.txt выглядит следующим образом (пробел между серийным номером и предложением равен tab):

S00001LP    this is a nested problem
S00002LP    that cannot be solved
S00003LP    and it's pissing me off
S00004LP    badly

current.txt выглядит следующим образом (пробел между первым и вторым предложениями равен a):

this is a nested problem    wakaraa pii ney bay tam
and i really can't solve it    shuu ipp faa luiip
so i come to seek help from stackoverflow    lakjsd sdiiije
seriously it is crazy because such    foo bar bar foo
problems don't happen in other languages    whaloemver ahjd
and it's pissing me off    gaga ooo mama
badly    wahahahah

требуемый вывод будет выглядеть примерно так:

S00001LP    this is a nested problem    wakaraa pii ney bay tam
and i really can't solve it    shuu ipp faa luiip
so i come to seek help from stackoverflow    lakjsd sdiiije
seriously it is crazy because such    foo bar bar foo
problems don't happen in other languages    whaloemver ahjd
S00003LP    and it's pissing me off    gaga ooo mama
S00004LP    badly    wahahahah

Ответы [ 2 ]

6 голосов
/ 27 июня 2011

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

Попробуйте изменить это:

reader = csv.reader(open("reference.txt"), delimiter = "\t")
reader2 = csv.reader(open("current.txt"), delimiter = "\t")

reader = list(csv.reader(open("reference.txt"), delimiter = "\t"))
reader2 = list(csv.reader(open("current.txt"), delimiter = "\t"))

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '' '', чтобы создать список в памяти, который затем можно будет повторять столько раз, сколько вам нужно.

Лучшим решением было бы сохранить ваши справочные данные в словаре, чтобы вам не приходилось их циклически проходить для каждой строки в ваших данных.

4 голосов
/ 27 июня 2011

Один из подходов - создать словарь, сопоставляющий ваши ключи с серийными номерами:

serials = dict(map(reversed, reader))
for line in reader2:
    serial = serials.get(line[0])
    if serial is not None:
        print serial

Это будет намного быстрее, чем вложенный цикл.

В первой строке создается словарь, сопоставляющий ключи с серийными номерами. Так как конструктор словаря ожидает итерации пар (ключ, значение), в то время как ваш файл фактически содержит пары (значение, ключ), мы должны поменять две записи в каждой записи - это то, что map(reversed, ...) делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...