如何制作更长的if而不是for循环

时间:2014-02-14 12:08:33

标签: python

我有一个带有名称的文本文件names.txt(每行有一个名字)。我想在if子句中使用相同时间的所有名称。这是我做的:

with open("names.txt") as f:   # reading to list
  names = f.read().splitlines() #names contains all names in a list

for name in names:
  if "name" == "John":
    do something...

此代码的问题是,对于names.txt中的每个名称,都会触发for循环。但我真正想做的是用更长的if子句代替for循环:

  if (name == "John") or (name2 == "John") or (name3 == "John"): # ...
    do something...

现在的问题是我不知道如何制作if子句,因为names.txt中的项目(名称)的数量有所不同。使用len()我可以得到长度,但我怎么能做这样的if子句?如果特定name匹配John,我需要在变量中使用此name以获取更多内容。我希望你明白我的意思。我不想为每个名字都进行for循环。我想用一个名字制作一个if子句。一旦名称匹配,我需要存储在变量中的名称才能使用它。

3 个答案:

答案 0 :(得分:1)

这对python来说非常完美。就这样做:

if "John" in names:
    do something...

答案 1 :(得分:0)

您可以使用此功能,例如:

if any(name == "John" for name in names):
    do something...

编辑:只有一件事:这个if(或塞巴斯蒂安建议的那个)做你先说的话“[...]现在问题是我不知道如何制作if子句因为金额项目[...]“。

无论如何,我会假设你没有匹配确切的名字,因为它没有意义,除非你想要计算它们,你可以这么做:

johns = names.count("John")

现在,如果您想要包含 John的名称,那么您可以这样做:

with open("names.txt") as f:
    for name in (n for n in f if "John" in n):
        do some stuff...

答案 2 :(得分:0)

如果您想在找到第一个"John"时停止,可以break循环:

for name in names:
    if name == "John": # note no quotes around name
        # do something...
        break

这意味着if块的内容只运行一次。

虽然您可以预先测试是否会评估True(例如if "John" inif any(...)),但意味着足够的循环要查找"John"或到达列表末尾的名称。

如果您想了解您正在使用的"John" ,您也可以使用该索引:

for index, name in enumerate(names):
    if name == "John":
        print("Found '{0}' at index {1}.".format(name, index))