映射reduce的代码python时出现错误“字符串索引超出范围”

2024-09-29 21:58:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据看起来像:

 1 1.45
 1 1.153
 2 2.179
 2 2.206
 2 2.59
 2 2.111
 3 3.201
 3 3.175
 4 4.228
 4 4.161
 4 4.213

我想要的输出是:

 1  2  (1 occurs 2 times)
 2  4
 3  2
 4  3

为此,我运行以下代码:

SubPatent2count = {}
for line in data.split('\n'):
    for num in line.split('\t'):
        Mapper_data = ["%s\t%d" % (num[0], 1) ]
        for line in Mapper_data:
            Sub_Patent,count = line.strip().split('\t',1)
            try:
                count = int(count)
            except ValueError:
                continue

            try:
                SubPatent2count[Sub_Patent] = SubPatent2count[Sub_Patent]+count
            except:
                SubPatent2count[Sub_Patent] = count
for Sub_Patent in SubPatent2count.keys():
    print ('%s\t%s'% ( Sub_Patent,  SubPatent2count[Sub_Patent] ))

最后我得到一个错误:

     3    for num in line.split('\t'):
     4         #print(num[0])
----> 5         Mapper_data = ["%s\t%d" % (num[0], 1) ]
     6         #print(Mapper_data)
     7         for line in Mapper_data:

IndexError: string index out of range

如果你有任何想法,我可以处理这个错误,请帮助。 谢谢您!你知道吗


Tags: infordatacount错误linenumsplit
3条回答

只是建议另一种方法:你试过列表理解+groupy来自itertools吗?你知道吗

from itertools import groupby

print([(key, len(list(group))) for key, group in groupby([x.split(' ')[0] for x in data.split('\n')])])
# where [x.split(' ')[0] for x in data.split('\n')] generates a list of all starting number
# and groupy counts them

或者如果你想要精确的输出:

from itertools import groupby

mylist = [(key, len(list(group))) for key, group in groupby([x.split(' ')[0] for x in data.split('\n')])]


for key, repetition in mylist:
    print(key, repetition)

谢谢大家,你们的建议对我很有帮助,我修改了代码如下:

SubPatent2count = {}
for line in data.split('\n'):
Mapper_data = ["%s\o%d" % (line.split(' ')[0], 1) ]
    for line in Mapper_data:
            Sub_Patent,count = line.strip().split('\o',1)
            try:
                count = int(count)
            except ValueError:
                continue

            try:
                SubPatent2count[Sub_Patent] = SubPatent2count[Sub_Patent]+count
           except:
                SubPatent2count[Sub_Patent] = count
for Sub_Patent in SubPatent2count.keys():
    print ('%s\t%s'% ( Sub_Patent,  SubPatent2count[Sub_Patent] )) 

结果如下:

1  2  (1 occurs 2 times)
2  4
3  2
4  3

num[0]可能是一个空字符串,这就是为什么会出现索引超出范围错误的原因。另一种可能性是,实际上是用空字符串(而不是制表符)分隔每行中的数字。你知道吗

不管怎样,你的代码似乎有点奇怪。例如,将数据编码为一个元素列表(Mapped_data)中的字符串,然后对其进行解码以处理它。这真的没有必要,你应该避免。你知道吗

请尝试以下代码:

from collections import Counter

decoded_data = [ int(l.split(' ', 1)[0]) for l in data.split('\n') if len(l)>0]
SubPatent2count = Counter(decoded_data)

for k in SubPatent2count:
    print k, SubPatent2count[k]

相关问题 更多 >

    热门问题