python - 一个单词在列表中的多个位置?(初学者)
问题描述
我试图打印一个列表,其中包含“From”一词在文本上的所有位置:
name = input("Enter file: ")
if len(name) < 1 : name = "mbox-short.txt"
h= open(name)
r= h.read()
r= r.split()
l= []
for i in r:
if i == "From":
x= enumerate(i)
l.append(x)
print(l)
我有一周的 Python 经验,所以我读到 enumaerate 是一个不错的选择,但结果是
Enter file:
[<enumerate object at 0x000001737D5B59A8>, <enumerate object at 0x000001737D5B59F8>, <enumerate object at 0x000001737D5B5A48>, <enumerate object at 0x000001737D5B5A98>, <enumerate object at 0x000001737D5B5AE8>, <enumerate object at 0x000001737D5B5B38>, <enumerate object at 0x000001737D5B5B88>, <enumerate object at 0x000001737D5B5BD8>, <enumerate object at 0x000001737D5B5C28>, <enumerate object at 0x000001737D5B5C78>, <enumerate object at 0x000001737D5B5CC8>, <enumerate object at 0x000001737D5B5D18>, <enumerate object at 0x000001737D5B5D68>, <enumerate object at 0x000001737D5B5DB8>, <enumerate object at 0x000001737D5B5E08>, <enumerate object at 0x000001737D5B5E58>, <enumerate object at 0x000001737D5B5EA8>, <enumerate object at 0x000001737D5B5EF8>, <enumerate object at 0x000001737D5B5F48>, <enumerate object at 0x000001737D5B5F98>, <enumerate object at 0x000001737D61F048>, <enumerate object at 0x000001737D61F098>, <enumerate object at 0x000001737D61F0E8>, <enumerate object at 0x000001737D61F138>, <enumerate object at 0x000001737D61F188>, <enumerate object at 0x000001737D61F1D8>, <enumerate object at 0x000001737D61F228>]
当我想要这样的东西时:
Enter file:
[2,5,6,8,11]
有谁知道使用什么函数而不是枚举。谢谢和抱歉,如果这是一个简单的问题。
解决方案
给您enumerate
的是每个项目及其索引的序列。所以你不想枚举每个单独的项目,你想枚举列表并使用它来获取索引:
for x, i in enumerate(r):
if i == "From":
l.append(x)
由于无论如何我都在看这段代码,所以我会给出一些关于在你开始时开始建立良好习惯的建议:
- 当您想使用“默认”作为空或未设置的替代方案时,您通常可以使用
or
(即,如果它是“真实”/非空,则使用此值,否则使用此其他值)。 - 如果您只打算使用一个值来生成其他值,请考虑不要将中间步骤分配给命名变量;您通常可以通过将操作链接在一起来使事情更简洁。例如,您可能不会这样做:
x1 = 2 + 3
x2 = x1 + 4
x = x2 + 5
# do thing with x
当你可以做的时候:
x = 2 + 3 + 4 + 5
# do thing with x
- 当你为一个值命名时,给它一个能表明它是什么的名字!不必很长,但至少应该足够,如果你有三个不同的变量,你可以很容易地跟踪哪个是哪个。
- 在 Python 中打开文件时,通常最好使用
with open...
在“上下文”中打开文件;该文件将自动close()
在块的末尾。 - 当您使用相对简单的操作构建列表时,通常最好在推导式 (
[x for x in ...]
) 中执行此操作,而不是append
在for
循环中执行此操作。它阅读起来更简洁,有时也更有效。
综上所述,这是您的五行脚本(如果您将其压缩一点,则为两行,但我喜欢用换行符来分解理解):
with open(input("Enter file: ") or "mbox-short.txt") as file:
print([
i for i, word in enumerate(file.read().split())
if word == "From"
])
推荐阅读
- python - QTreeWidgetItems 和 QLineEdit 回声模式
- python-3.x - 使用多个股票代码的数据集进行强化学习?
- javascript - 为什么 javascript 对象在 IE11 中有一个名为 Symbol()_a.* 的额外属性?
- python - 用 Pandas 解析嵌套的 JSON
- python - 在特定轴上迭代包含在 3D 数组中的 2D 数组的 Pythonic 方法
- amp-html - 超出 DIV 限制的 AMP 图像
- google-apps-script - GAS 中 DeveloperMetadata 的实际用例
- android - Android JNI 线程未同时运行
- java - 在根项目中找不到任务“阶段”-Heroku buildback 未检测到 Spring Boot
- javascript - 当从 main.js 导入 canv 时,如何解决“未捕获的 ReferenceError:canv 未在 otherfile.js:3 中定义”