Попытка разбить на ":" и "," в Python, но не удалось с ValueError - PullRequest
3 голосов
/ 31 октября 2011

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

Вот мой файл:

axe99:315 W. 115th Street, Apt. 11B:New York:NY:10027
jab44:23 Rivington Street, Apt. 3R:New York:NY:10002
ap172:19 Boxer Rd.:New York:NY:10005
jb23:115 Karas Dr.:Jersey City:NJ:07127
jb29:119 Xylon Dr.:Jersey City:NJ:07127
ak9:234 Main Street:Philadelphia:PA:08990

Вот мой код:

f2data = open('ex1.txt')
for line in f2data:
    print line.strip().split(':')
    city_dict = dict(item.split(':') for item in line.strip('\n').split(','))
    print city_dict

Он продолжает выдавать эту ошибку:

['jk43', '23 Marfield Lane', 'Plainview', 'NY', '10023']

city_dict = dict(item.split(':') for item in line.strip('\n').split(','))
ValueError: dictionary update sequence element #0 has length 5; 2 is required

Я новичок в Python и действительно не знаю, что означает эта ошибка, любые мысли очень ценятся!

Ответы [ 4 ]

3 голосов
/ 31 октября 2011

Вы получаете сообщение об ошибке, потому что вы пытаетесь вставить список из 5 элементов в конструктор словаря, когда он принимает только два элемента (в конструкторе dict Python считает, что вы используете):

здесьсписок возможных конструкторов

dict(one=1, two=2)
dict({'one': 1, 'two': 2})
dict(zip(('one', 'two'), (1, 2)))
dict([['two', 2], ['one', 1]])

взят из python docs

вам нужно будет разделить вашу строку по-другому или найти лучший способ форматирования ваших данных.Если вы читаете из файла csv, обратитесь к ответу Майкла Хоффмана, который является правильным способом чтения из CSV.

Если нет, укажите, что вы делаете и почему.


РЕДАКТИРОВАТЬ: Цель добавлена, ответ обновлен

для ввода:

axe99:315 W. 115th Street, Apt. 11B:New York:NY:10027
jab44:23 Rivington Street, Apt. 3R:New York:NY:10002
ap172:19 Boxer Rd.:New York:NY:10005
jb23:115 Karas Dr.:Jersey City:NJ:07127
jb29:119 Xylon Dr.:Jersey City:NJ:07127
ak9:234 Main Street:Philadelphia:PA:08990

код:

city_dict =  {}
for line in open('ex1.txt'):
    if item.split(':')[3] in city_dict:
        city_dict[item.split(':')[3]] += 1
    else:
        city_dict[item.split(':')[3]] = 1

print (city_dict)

выведет то, что вы хотите:

{'NY': 3, 'NJ': 2, 'PA': 1}

1 голос
/ 31 октября 2011

Предполагая Python2.7

from collections import Counter
with open('ex1.txt') as f2data:
    print Counter(tuple(item.split(":")[2:4]) for item in f2data)
1 голос
/ 31 октября 2011

Когда вы создаете dict из такого списка, вам нужен список из 2-х элементов (или кортежей). Например:

my_dict = dict([['axe99', 'New York'], ['jab44', 'New York']])

Это соответствует списку пар ключ / значение. Ошибка, которую вы получаете, состоит в том, что один из списков в списке, который вы передаете, имеет пять элементов, а не два.

0 голосов
/ 31 октября 2011

Я думаю, что вы можете захотеть что-то вроде этого:

from __future__ import with_statement

import collections
import csv

city_dict = collections.defaultdict(int)

with open('ex1.txt') as f2data:
    reader = csv.reader(f2data, delimiter=":")
    for row in reader:
        city_state = row[2:4]
        city_dict[city_state] += 1

print city_dict

Изменить: изменить, чтобы соответствовать уточненному описанию проблемы

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