Python 我不能正确使用枚举函数

Python 我不能正确使用枚举函数,python,svm,enumerate,Python,Svm,Enumerate,我写了一段代码,从文本文件(从pdf复制的简单文本文档)中枚举字符“a”: 如果我运行此脚本而不按照我的要求生成输出文件,则此代码的输出如下所示,对于每一行,它都会计算“a”的位置和频率,如在第一行中,“a”出现两次,第一次出现在第8位,第二次出现在第16位,因此被枚举为“1:8 2:16”,因此每一行都有一个: 1:8 2:16 1:4 2:47 3:51 1:42 1:7 1:14 2:26 3:40 但当我在文本文件“svm_in.txt”中用“output_f.write()

我写了一段代码,从文本文件(从pdf复制的简单文本文档)中枚举字符“a”:

如果我运行此脚本而不按照我的要求生成输出文件,则此代码的输出如下所示,对于每一行,它都会计算“a”的位置和频率,如在第一行中,“a”出现两次,第一次出现在第8位,第二次出现在第16位,因此被枚举为“1:8 2:16”,因此每一行都有一个:

1:8 2:16 
1:4 2:47 3:51 
1:42 
1:7 
1:14 2:26 3:40 
但当我在文本文件“svm_in.txt”中用“output_f.write()”写下输出时,输出是非常有线的。 像这样的事情:

1:8 2:16 1:4 2:47 3:51 1:42 1:7 1:14 2:26 3:40 
如何在输出文件中获得每行的结果,每行的开头都有“+”正弦,如下所示:

+ 1:8 2:16 
+ 1:4 2:47 3:51 
+ 1:42 
+ 1:7 
+ 1:14 2:26 3:40 

不要打印换行符,而是将其写入文件:

for line in input_f :
    output_f.write("\n+ ")
    for y in enumerate([x[0] for x in enumerate(line) if x[1]=='a']): 
        a = ("%d:%d" % (y[0]+1,y[1]+1))
        output_f.write(a + " ")        
您可以使用一些元组解包来更清楚地说明您正在枚举的内容,并且您可以删除
[…]
列表理解,转而使用生成器表达式(节省一些内存和处理):

我还为
enumerate()
函数提供了第二个参数,即起始值,这样就不必对每个数字执行
+1
操作,并在文件输出中以字符串格式添加了空格

你通常会在写一行之后再写换行符;如果每行需要一个计数器,请添加另一个枚举::

for count, line in enumerate(input_f, 1):
    output_f.write("%d+ " % count)
    for i, pos in enumerate((pos for pos, char in enumerate(line, 1) if char == 'a'), 1):
        output_f.write('%d:%d ' % (i, pos))
    output_f.write('\n')
或者,通过使用
str.join()
可以一次创建一整行,使用格式化在一次格式化操作中包含前缀和换行符:

for count, line in enumerate(input_f, 1):
    positions = (pos for pos, char in enumerate(line, 1) if char == 'a')
    line = ' '.join(['%d:%d' % (i, pos) for i, pos in enumerate(positions, 1)])
    output_f.write("%d+ %s\n" % (count, line))

这也巧妙地避免了尾随空格。

不要打印换行符,而是将它们写入文件:

for line in input_f :
    output_f.write("\n+ ")
    for y in enumerate([x[0] for x in enumerate(line) if x[1]=='a']): 
        a = ("%d:%d" % (y[0]+1,y[1]+1))
        output_f.write(a + " ")        
您可以使用一些元组解包来更清楚地说明您正在枚举的内容,并且您可以删除
[…]
列表理解,转而使用生成器表达式(节省一些内存和处理):

我还为
enumerate()
函数提供了第二个参数,即起始值,这样就不必对每个数字执行
+1
操作,并在文件输出中以字符串格式添加了空格

你通常会在写一行之后再写换行符;如果每行需要一个计数器,请添加另一个枚举::

for count, line in enumerate(input_f, 1):
    output_f.write("%d+ " % count)
    for i, pos in enumerate((pos for pos, char in enumerate(line, 1) if char == 'a'), 1):
        output_f.write('%d:%d ' % (i, pos))
    output_f.write('\n')
或者,通过使用
str.join()
可以一次创建一整行,使用格式化在一次格式化操作中包含前缀和换行符:

for count, line in enumerate(input_f, 1):
    positions = (pos for pos, char in enumerate(line, 1) if char == 'a')
    line = ' '.join(['%d:%d' % (i, pos) for i, pos in enumerate(positions, 1)])
    output_f.write("%d+ %s\n" % (count, line))

这也巧妙地避免了尾随空格。

我会这样做:

for line in input_f:

    # find the positions of As in the line
    positions = [n for n, letter in enumerate(line, 1) if letter == 'a']

    # Create list of strings of the form "x:y"
    pairs = [("%d:%d" % (i, n)) for i, n in enumerate(positions, 1)]

    # Join all those strings into a single space-separated string
    all_pairs = ' '.join(pairs)

    # Write the string to the file, with a + sign at the beginning
    # and a newline at the end
    output_f.write("+ %s\n" % all_pairs)

您可以修改最后一行中的字符串,以控制如何在输出文件中写入该行。

我将这样做:

for line in input_f:

    # find the positions of As in the line
    positions = [n for n, letter in enumerate(line, 1) if letter == 'a']

    # Create list of strings of the form "x:y"
    pairs = [("%d:%d" % (i, n)) for i, n in enumerate(positions, 1)]

    # Join all those strings into a single space-separated string
    all_pairs = ' '.join(pairs)

    # Write the string to the file, with a + sign at the beginning
    # and a newline at the end
    output_f.write("+ %s\n" % all_pairs)


您可以修改最后一行中的字符串,以控制如何在输出文件中写入该行。

您需要将
'\n'
换行符写入文件,而不是
打印它们。这并不能解决您的问题,但我有一个建议,使您的代码更加习惯。使用
enumerate
时,在表达式的目标列表中指定两个变量:
([index for index,char in enumerate(line)if char=='a'])
您需要将
'\n'
换行字符写入文件,而不是
打印它们。这并不能解决您的问题,但我有一个建议,让您的代码更为习惯化。当使用
枚举
时,在表达式的目标列表中给出两个变量:
([index for index,char in enumerate(line)if char=='a'])
@Martijn 100个喜欢和100个投票感谢我已经努力了3个小时,实际上我是一个初学者,而不是简单地复制过去我一直在努力学习的东西Thaaaaaaanks:)@martijn嘿,当我按照你的建议修改我的脚本时,我想到了两个小采石场。首先,语句“output\u f.write(“\n+””)在开头添加不需要的新行字符;其次,如何在“+”之前添加行号像这样1+1:8 2:16 2+1:4 2:47 3:51我试过一些东西,但它不起作用thanks@user2935002:罗伯托提议的加入实际上是为了更好地避免一开始的换行。我会更新为您添加一个计数器。@user2935002:counter and join added.@Martijn是的,我尝试使用Roberto的代码,我也发现了同样的情况,它避免了新行,最后我也添加了计数器,它在生成行号之前加上sine,非常感谢。@Martijn 100喜欢和100票,非常感谢我已经挣扎了3个小时,事实上,我是一个初学者,只是简单地模仿过去我一直在努力学习Thaaaaaaanks:)@martijn嘿,当我按照你的建议修改我的脚本时,我想到了两个小采石场。首先,语句“output\u f.write(“\n+””)在开头添加不需要的新行字符;其次,如何在“+”之前添加行号像这样1+1:8 2:16 2+1:4 2:47 3:51我试过一些东西,但它不起作用thanks@user2935002:罗伯托提议的加入实际上是为了更好地避免一开始的换行。我将更新以为您添加一个计数器。@user2935002:counter and join added。@Martijn是的,我尝试使用Roberto的代码,我也发现了相同的情况,它避免了新行,最后我也添加了计数器,它在前面生成了行号,非常感谢。感谢您解释每一行,您能解释一下这部分代码吗“”%d:%d“%”谢谢:)它创建了一个由两个整数组成的字符串,用冒号分隔(
)。
%
右侧的元组是整数。例如,在python控制台中键入以下内容:
“%d:%d%”(1,2)
感谢您解释每一行,您能解释一下代码“%d:%d%”的这一部分吗谢谢:)它创建了一个由两个整数组成的字符串,两个整数之间用冒号隔开(
)。
%
右侧的元组是整数。例如,在python控制台中键入以下内容:
“%d:%d”