For-l oop over словарь не работает, если словарь пуст - PullRequest
0 голосов
/ 02 февраля 2020

Я учусь Python, и я наткнулся на то, что сам не могу понять.

У меня есть текстовый файл mbox-short.txt со строками вроде:

From stephen.marquard@uct.ac.za Sat Jan  5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
Received: from murder (mail.umich.edu [141.211.14.90])

From louis@media.berkeley.edu Fri Jan  4 18:10:48 2008
Return-Path: <postmaster@collab.sakaiproject.org>
Received: from murder (mail.umich.edu [141.211.14.97])

From zqian@umich.edu Fri Jan  4 16:10:39 2008
Return-Path: <postmaster@collab.sakaiproject.org>
Received: from murder (mail.umich.edu [141.211.14.25])

Следующий код работает нормально:

x = open('mbox-short.txt')
y = dict()
count = int()
for line in x:                     # read every line of <file>
    if line.startswith('From '):   # check if <line> starts with <'From '>
        line1 = line.split(' ')    # split <line> into separate words -> <line1>
        count = count + 1          # count every <'From '> occurence
        w = line1[1]               # 2nd word of <line1>
        if w not in y:             # check if 2nd word of <line1>(=w) is already in dict <y>
            y[w] = 1               # add 2nd word of <line1> as key with <value>=1 
        else:
            y[w] += 1              # or +1 to <value>
print(y)

Он работает, даже когда на старте y по-прежнему пустой диктант.

Вывод:

{'stephen.marquard@uct.ac.za': 2, 'louis@media.berkeley.edu': 3, ... 'ray@media.berkeley.edu': 1}

В учебном пособии, с которым я работаю, есть еще один пример, использующий метод .get:

word = 'brontosaurus'
d = dict()
for c in word:
    d[c] = d.get(c,0) + 1
print(d)

Когда я пытаюсь это сделать:

x = 'file'
y = dict()
count = int()
for line in x:                     # read every line of <file>
    if line.startswith('From '):   # check if <line> starts with <'From '>
        line1 = line.split(' ')    # split <line> into separate words -> <line1>
        count = count + 1          # count every <'From '> occurence
        w = line1[1]               # 2nd word of <line1>
        for w in y:                # alternate + simplified form using <dict.get> method
            y[w] = y.get(w,0) + 1  # check if <w> is already in dict y, if not, add it
print(y)

Сбой. Вывод:

{}

Используя отладчик, я вижу, что for w in y: l oop не выполняется. Это просто выскакивает в y.

Я не понимаю, почему.

1 Ответ

0 голосов
/ 02 февраля 2020
for w in y:
    y[w] = y.get(w,0) + 1

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

Если y пуст в начале, for w in y будет повторять словарь ноль раз, а вторая Строка никогда не будет выполнена, поэтому ничего не будет добавлено в словарь, поэтому в конце она печатает {}.

y.get(w, 0) уже означает: «проверить, если w в y если да, дай мне y[w], в противном случае дай мне 0 ".

Тебе не нужен if и нет for l oop здесь.

Просто поменяй их две строки:

 y[w] = y.get(w,0) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...