【问题标题】:Can I use a List Comprehension to get Line Indexes from a file?我可以使用列表理解从文件中获取行索引吗?
【发布时间】:2009-05-07 16:04:39
【问题描述】:

我需要确定文件中可能存在某些标记的位置。我开始认为我会使用 list.index 但我很快发现它返回第一个(并且只有第一个)项目。所以我决定实施我自己的解决方案,即

count=0
docIndex=[]
for line in open('myfile.txt','r'):
    if 'mystring' in line:
        docIndex.append(count)
    count+=1

但这是 Python 对的。必须有一个更简单的解决方案,因为它是 Python。在这个网站和网络上搜寻我想出了一些更好的东西

newDocIndex=[]
for line in fileinput.input('myfile',inplace=1):
    if 'mystring' in line:
    newDocIndex.append(fileinput.lineno())

我知道这信息太多了,但自从我昨晚完成了评分期末考试后,我觉得很好——这是 Python,我们想在今年夏天取得一些进展——让我们试试列表理解

所以我这样做了:

[fileinput.lineno() for line in fileinput.input('myfile',inplace=1) if 'mystring' in line]

并得到一个空列表。所以我首先猜测问题是for中的项目必须是用于构建列表的项目。也就是说,如果我有 line 而不是 fileinput.lineno() 我会有一个非空列表,但这不是问题。

上述过程可以简化为列表推导吗?

使用答案但对其进行调整以提高可读性

listOfLines=[lineNumb for lineNumb,dataLine in enumerate(open('myfile')) if 'mystring' in dataLine]

【问题讨论】:

  • 在“调整可读性”之前阅读python.org/dev/peps/pep-0008
  • 虽然我浏览了参考资料,但我不明白你的意思。
  • SilentGhost 可能意味着典型的 python 约定建议在变量名中的单词之间使用下划线。例如:list_of_lines 和 line_numb 而不是 listOfLines 和 lineNumb。

标签: python list-comprehension


【解决方案1】:

这个怎么样?

[index for index,line in enumerate(open('myfile.txt')) if 'mystring' in line]

【讨论】:

  • 没有什么?它以一种很好的 Python 方式完全按照您的代码所做的工作。
  • 这个解决方案是我不特别关心列表理解的原因。他们是不可理解的。我说的是脸颊,但实际上,为什么这被认为比更直截了当的东西“更好”?
  • 我了解到它们实际上更易于阅读。六个月前我会同意你的。我将进行编辑,看看是否更容易阅读
  • 哎呀我无法编辑答案看看我的问题我会将我建议的编辑添加到问题的末尾
  • @Bryan:他们直截了当!至于为什么你可以“导入这个”更好。
猜你喜欢
  • 2016-04-06
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多