#python #split
#python #разделение
Вопрос:
У меня есть файл, который я читаю, разделяю и помещаю в словарь. Я продолжаю получать ошибку, и я думаю, это потому, что адреса улиц содержат запятую (,).
Вот содержимое моего файла:
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 и действительно понятия не имею, что означает эта ошибка, любые мысли с благодарностью!
Комментарии:
1. Измените
f2data = open('ex1.txt')
f2data = open('ex1.txt').readlines()
и попробуйте еще раз. Кроме того, отформатируйте свой код. Невозможно прочитать как есть.2. Я не думаю, что это решит эту проблему.
3. @Bos, здесь нет необходимости
readlines()
4. Каков желаемый результат для city_dict?
5. @bos, спасибо за помощь, но это не сработало — «Ошибка значения: элемент последовательности обновления словаря # 0 имеет длину 1; требуется 2»
Ответ №1:
Вы получаете ошибку, потому что пытаетесь вставить список из 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
вам нужно будет разделить вашу строку по-другому или найти лучший способ форматирования ваших данных. Если вы читаете из 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. моя цель довольно проста, я хочу взять город и сделать его ключом, и подсчитать, сколько раз встречается каждый город, и сделать это моим значением
2. большое спасибо, именно то, что я хотел сделать — просто нужно было изменить идентификатор 3 на 2 для совпадения городов
3. Рад, что это было то, что вы искали, не могли бы вы отметить это как ответ, чтобы люди знали, что на этот вопрос был дан ответ? Мне это тоже помогает :).
Ответ №2:
Когда вы создаете a dict
из такого списка, вам нужен список из 2-элементных списков (или кортежей). Например:
my_dict = dict([['axe99', 'New York'], ['jab44', 'New York']])
Это соответствует списку пар ключ / значение. Ошибка, которую вы получаете, заключается в том, что один из списков в передаваемом вами списке содержит пять элементов, а не два.
Ответ №3:
Предполагая, что Python2.7
from collections import Counter
with open('ex1.txt') as f2data:
print Counter(tuple(item.split(":")[2:4]) for item in f2data)
Ответ №4:
Я думаю, вам может понадобиться что-то вроде этого:
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
Редактировать: изменить, чтобы соответствовать уточненному описанию проблемы