2012-08-09 62 views
1

我是一个初学者。我写了一个脚本,输入1000万个条目的输入列表(形式为:b,其中a和b是字母数字)。Python脚本创建字典时,为每个字典的键,有多个值(300条目)列表

现在我想从这些条目创建一本词典。对于很多列表条目,第二部分(在冒号后面)是常见的。 (例如a:b,f:b,k:b - 在这种情况下,我的密钥将是b,值将是列表[a,f,k])。

但不知怎的我的脚本被击中。我可以从日志中看到脚本被触发并且日志大小没有增加。 (对于我的字典中的每个键,都有一个大小在400到500之间的列表。这可能是一个问题吗?)

如果我的输入列表包含较少的项目,我的脚本正常工作。

名单的名字是比赛

print 'match2 list: %s' % match2 # it shows the 10 million entries in form of a:b as expected 
for i in xrange(len(match2)): 
    print 'Before Splitted variable : %s' % match2[i] # this print is for information 
    templist = re.split(':', '%s' % match2[i]) 
    print 'Splitted list : %s' % templist # this print is for information 
    length3 = len(templist) 
    print "Length3 :%d" %length3 
    key1 = templist[1] 
    value1 = templist[0] 
    if example.has_key(key1): 
     example[key1].append(value1) 
    else: 
     example[key1] = value1 

请给你的建议。

+0

该代码看起来不错。 。 。有点丑陋和低效率,但罚款;)我会添加一些东西打印出来,并检查它是否总是失败在同一点 - 可能是您的输入数据或一些周围的逻辑问题。 – ernie 2012-08-09 18:03:43

+0

它与你所问的问题无关,但我认为're.split'在这里是过度杀伤。你可以做'templist = match2 [i] .split(':',maxsplit = 1)',这样可以保证'len(templist)== 2'的好处,因为最多只有一次分割。 – 2012-08-09 18:29:00

+0

如果你知道你的列表项总是有一个':',并且执行'value1,key1 = match2 [i] .split(':',maxsplit = 1)',你甚至可以更进一步。 – 2012-08-09 18:30:12

回答

2

我怀疑问题就在这里:

if example.has_key(key1): 
    example[key1].append(value1) 
else: 
    example[key1] = value1 

example不含key1,它创造了一个新的入口,它的值是字符串value1。如果示例确实包含key1,它会尝试将字符串value1附加到已存在的任何内容。但是,这没有意义。您不能使用append追加两个字符串。

你可能想:

if example.has_key(key1): 
    example[key1].append(value1) 
else: 
    example[key1] = [value1] #the value is a list containing one string 
+0

不错,但不应该抛出一个AttributeError并保释出来? – ernie 2012-08-09 18:26:42

+0

是的,这就是我测试代码时发生的情况。我怀疑OP有一个试图抓住更高的地方,那就是默默地吃掉错误。 – Kevin 2012-08-09 18:30:02

+0

如果它之前有'try:except:',它不会立即退出循环还是继续循环,而不是冻结? – Josiah 2012-08-10 03:19:08