如果字符在列表中,则为python增量计数器,如果字符不在列表中,则为python增量计数器

如果字符在列表中,则为python增量计数器,如果字符不在列表中,则为python增量计数器,python,list,counter,increment,Python,List,Counter,Increment,只是想知道是否有更好的方法来完成以下任务: 我想: 1检查第[0]行是否为字符串编号,如果为true,则设置计数器=1 2转到下一行,再次检查第[0]行是否为字符串编号,如果为false,则继续递增计数器*直到它在第[0]行中找到字符串编号 3如果在第[0]行中找到字符串编号,则重新启动计数器,即设置计数器=1 以下是该文件的示例: 555 xxxxxxxxxxxxxxx r a n d o m data 888 xxxxxxxxxxxxxxx r a

只是想知道是否有更好的方法来完成以下任务:

我想:

1检查第[0]行是否为字符串编号,如果为true,则设置计数器=1

2转到下一行,再次检查第[0]行是否为字符串编号,如果为false,则继续递增计数器*直到它在第[0]行中找到字符串编号

3如果在第[0]行中找到字符串编号,则重新启动计数器,即设置计数器=1

以下是该文件的示例:

555 xxxxxxxxxxxxxxx
r
 a
  n
   d
    o
     m
      data
888 xxxxxxxxxxxxxxx
r
 a
  n
   d
    o
     m
      data
我的结果是并且应该是:

1 555 xxxxxxxxxxxxxxx
2 r
3  a
4   n
5    d
6     o
7      m
8       data
1 888 xxxxxxxxxxxxxxx
2 r
3  a
4   n
5    d
6     o
7      m
8       data
这是我的代码,我希望有人能更新它。。。或者换句话说,你会怎么做?谢谢

list1 = ['1','2','3','4','5','6','7','8','9','0']
counter = {}

with open('O:/py_files/countlines.txt', 'rb') as infile,\
open('O:/py_files/countlines_out.txt', 'wb') as outfile:
    for line in infile:

        if line[0] in list1:
            counter = 1
            outfile.writelines(str(counter) + ' ' + line)
            print str(counter) + ' ' + line

        elif line[0] not in list1:
            counter = counter + 1
            outfile.writelines(str(counter) + ' ' + line)
            print str(counter) + ' ' + line

        else:
            outfile.writelines('something went wrong...')
            print 'something went wrong...'
可以使用单个if语句简化整个代码

with open('O:/py_files/countlines.txt', 'rb') as infile,\
open('O:/py_files/countlines_out.txt', 'wb') as outfile:
   counter = 1
   for line in infile:
        if line[0].isdigit():
                counter = 1

        out = str(counter)+' '+line
        outfile.write(out)
        counter += 1
字符串的isdigit方法检查字符串是否为十进制

123.I数字 真的

你好,isdigit 假的

计数器被指定为整数。因此计数器={}是无用的。如果需要,可以初始化计数器=1 这是不必要的,因为输入中的第一行以数字开头,if evaluvates True在这里为您初始化计数器

程序打算为它读取的每一行进行写入。因此,write语句可以保留在if之外


else语句是无用的。列表中的if行[0]和列表中的if行[0]是互斥的。该程序永远不会到达其他位置

您可以使用isdigit,如下所示:

if line[0].isdigit():
    # Your Code        
计数器=0 对于填充中的线:

    if line[0].isdigit():
        counter = 1
    else:
        counter += 1

    out = str(counter)+' '+line,
    outfile.write(out)

如果第[0]行是数字计数器,则计数器将为1,否则计数器将递增。

如果字符串中的所有字符都是数字且至少有一个字符,则返回true,否则返回false。对于8位字符串,此方法取决于语言环境。

使用str.isdigit-顺便说一句,counter={}将计数器初始化为空的dict。这不是您在这里要做的,因为后面的代码中计数器只是用作整数。刚刚尝试了您的代码,我收到一个TypeError:必须是string或buffer,不是tuple我同意程序不应该到达else,但是在创建if语句“以防万一”时是否应该始终使用else。。。。outfile.WriteLineOut修复了它同样,为什么在out=strcounter+''+行的末尾使用逗号,我尝试了使用和不使用逗号,得到了相同的结果?谢谢,打字错误。从'out=strcounter+''+行中删除,'使其成为out=strcounter+''+行。Answer EditedAther?,只是为了澄清一下,由于第[0]行的原因,程序末尾的计数器+=1会继续递增。数字是否正确?请在实际需要时使用else,否则只会给代码添加不必要的混乱。而且您永远不应该在mylist中有if行[0]和elif行[0]这样的内容:因为条件是互斥的,因此elif分支中的测试是*完全冗余的。@Apero是的,谢谢。同样,我仍在学习,所以下面的代码对我来说更有意义,不要怀疑你的答案,但我是py的新手。你可以将infle.read.splitlines中的for行替换为infle中的for行:Apero,正如我对nu11p01n73R所说的,考虑如果代码中的第一行不以数字开头,该代码将做什么。是否有使用.read.splitlines的特定原因?@jes516:这取决于您是否希望正在处理的行以“\n”结尾。read.splitlines版本去掉了结尾的“\n”,而infle:中的for行没有。另外,read.splitlines必须在循环开始之前将整个文件读入内存,而另一个版本一次只读取和存储一行,因此处理大型文件会更好。您总是可以使用str.strip方法去掉字符串末尾的空白。
    if line[0].isdigit():
        counter = 1
    else:
        counter += 1

    out = str(counter)+' '+line,
    outfile.write(out)