试图在Python中拆分“:”和“,”但是没有使用ValueError

时间:2011-10-31 04:20:28

标签: python split

我有一个文件,我正在阅读并拆分并推入字典。我一直收到错误,我认为是因为街道地址包含逗号(,)。

这是我的文件内容:

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 个答案:

答案 0 :(得分:3)

您收到错误是因为您尝试将包含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文件,请参阅Michael Hoffman的回答,这是从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 :(得分:1)

当您从这样的列表创建dict时,您需要一个包含2个元素列表(或元组)的列表。例如:

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

这对应于键/值对的列表。您得到的错误是因为您传入的列表中的一个列表有五个元素,而不是两个。

答案 2 :(得分:1)

假设Python2.7

from collections import Counter
with open('ex1.txt') as f2data:
    print Counter(tuple(item.split(":")[2:4]) for item in f2data)

答案 3 :(得分:0)

我想你可能会想要这样的东西:

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

修改:更改以适应明确的问题说明