首页 > 解决方案 > 一个单词在列表中的多个位置?(初学者)

问题描述

我试图打印一个列表,其中包含“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]

有谁知道使用什么函数而不是枚举。谢谢和抱歉,如果这是一个简单的问题。

标签: pythonlist

解决方案


给您enumerate的是每个项目及其索引的序列。所以你不想枚举每个单独的项目,你想枚举列表并使用它来获取索引:

for x, i in enumerate(r):
    if i == "From":
        l.append(x)

由于无论如何我都在看这段代码,所以我会给出一些关于在你开始时开始建立良好习惯的建议:

  1. 当您想使用“默认”作为空或未设置的替代方案时,您通常可以使用or(即,如果它是“真实”/非空,则使用此值,否则使用此其他值)。
  2. 如果您只打算使用一个值来生成其他值,请考虑不要将中间步骤分配给命名变量;您通常可以通过将操作链接在一起来使事情更简洁。例如,您可能不会这样做:
    x1 = 2 + 3
    x2 = x1 + 4
    x = x2 + 5
    # do thing with x

当你可以做的时候:

    x = 2 + 3 + 4 + 5
    # do thing with x
  1. 当你为一个值命名时,给它一个能表明它是什么的名字!不必很长,但至少应该足够,如果你有三个不同的变量,你可以很容易地跟踪哪个是哪个。
  2. 在 Python 中打开文件时,通常最好使用with open...在“上下文”中打开文件;该文件将自动close()在块的末尾。
  3. 当您使用相对简单的操作构建列表时,通常最好在推导式 ( [x for x in ...]) 中执行此操作,而不是appendfor循环中执行此操作。它阅读起来更简洁,有时也更有效。

综上所述,这是您的五行脚本(如果您将其压缩一点,则为两行,但我喜欢用换行符来分解理解):

with open(input("Enter file: ") or "mbox-short.txt") as file:
    print([
        i for i, word in enumerate(file.read().split())
        if word == "From"
    ])

推荐阅读