【问题标题】:Find word index in string in python在python中查找字符串中的单词索引
【发布时间】:2018-11-20 04:15:34
【问题描述】:

我有一个列表,我想找到以伊朗开头的任何单词的索引并打印它们。

import pytz
word = 'iran'
text = str(pytz.all_timezones).lower()
for t in text.split():
    if t.startswith(word):
       print(text[t.index(word)])

输出是 'a' 和 ',' 但我需要任何包含 iran 的单词

【问题讨论】:

  • 那是因为你在 list 上调用了 str 。如果您直接迭代 pytz.all_timezones 而不是在每个上面调用 .lower() - 您会得到预期的结果
  • 想要的输出是什么???

标签: python pytz


【解决方案1】:

您的代码不起作用的原因是您将列表转换为字符串,因此方括号和撇号也被呈现到字符串中。
所以与伊朗相关的时区实际上是字符串:“'iran'”。那就是字符串的第一个字母是撇号,所以当你调用 t.startswith(word) 时,它不匹配。
我认为转换为字符串的目的是让您可以将所有单词都转换为小写。实现这一目标的更好方法是:

timezones = [tz.lower() for tz in pytz.all_timezones]

【讨论】:

    【解决方案2】:

    正如我已经提到的 - 问题出在您的字符串转换列表中。 当您在 pytz.all_timezones 上调用 str() 时 - 您将获得列表的字符串表示形式,包括所有标点符号。因此,当您调用 split - 结果列表中的每个单词(第一个除外)都以 ' 字符开头。

    尝试像这样 sn-p 直接迭代pytz.all_timezones

    for index, zone in enumerate(pytz.all_timezones):
        if zone.lower().startswith(word):
            print(index)
    

    【讨论】:

      【解决方案3】:

      也许你可以使用

      import pytz
      word = 'iran'
      text = [x.lower() for x in pytz.all_timezones]
      for t in text:
          if t.startswith(word):
              print(text.index(t))
      

      列表理解和lower() 用于制作一个列表,其中的元素是字符串。

      这些元素用startswith()检查,如果它的返回值为True,它的索引用index()打印。

      输出:

      507
      

      【讨论】:

      • 我认为为简单的for 循环构建新列表而不是使用原始列表不是一个好主意
      • @YaroslavSurzhikov 是的,我的答案有 2 个循环。你的更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2021-06-30
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多