在Python中尝试用 ":" 和 "," 分割,但遇到ValueError

3 投票
4 回答
1322 浏览
提问于 2025-04-17 05:19

我有一个文件,我正在读取这个文件,然后把内容分开并放进一个字典里。但是我一直遇到一个错误,我觉得可能是因为街道地址里有一个逗号(,)。

这是我文件的内容:

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 个回答

1

当你从一个列表创建一个 dict(字典)时,你需要一个包含两个元素的列表(或者元组)的列表。比如说:

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

这其实就是一组键值对的列表。你遇到的错误是因为你传入的列表中,有一个子列表有五个元素,而不是两个。

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

你遇到这个错误是因为你试图把一个包含5个项目的列表放进一个字典构造器里,而这个构造器只接受两个项目(在字典构造器中,Python认为你在使用的是):

这里有一些可能的构造器列表

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

这些内容摘自Python文档

你需要以不同的方式拆分你的字符串,或者找到更好的方法来格式化你的数据。如果你是从一个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}

撰写回答