Python 如何有效地检查for循环中的变量

Python 如何有效地检查for循环中的变量,python,list,for-loop,Python,List,For Loop,我有八个变量,我想在for循环中检查当前行。我认为可能有一个比我现在拥有的更好的方法 我现在有5个不同的if语句 with open('stuff.txt', 'r') as f: lines = f.read().splitlines() for line in lines: if line == str(sameDay): bag.append(line) if line == str(threeDaysAgo):

我有八个变量,我想在for循环中检查当前行。我认为可能有一个比我现在拥有的更好的方法

我现在有5个不同的if语句

with open('stuff.txt', 'r') as f:
    lines = f.read().splitlines()
    for line in lines:
        if line == str(sameDay):
            bag.append(line)
        if line == str(threeDaysAgo):
            bag.append(line)
        if line == str(weekAgo):
            bag.append(line)
        if line == str(monthAgo):
            bag.append(line)
        if line == str(threeDaysAgo):
            bag.append(line)
您可能希望事先将列表保存在一个变量中,使其更加清晰。

比使用多个if语句更好,而且比多次调用append更有效

variables = set(map(str, [sameDay, threeDayAgo, weekAgo...]))

def check_variables(lines):
    for line in lines:
        if line in variables:
            yield line

编辑:将变量设置为一个集合,因为它的运行速度比列表快。如果行非常长,则非常有用。

您可以删除并定义有效行的列表,然后检查读取行是否在列表中。如果是,则附加到包中。 此外,我们可以使用列表理解来提高效率

VALID_LINES = [str(sameDay), str(threeDaysAgo), str(weekAgo), str(monthAgo), str(threeDaysAgo)]
with open('stuff.txt', 'r') as f:
    lines = f.read().splitlines()
    [bag.append(line) for line in lines if line in VALID_LINES]

您可以使用:

acceptable = {str(e) for e in [sameDay, threeDaysAgo, monthAgo, hreeDaysAgo]}
with open('stuff.txt', 'r') as f:
    bag = [line for line in f.readlines() if line in acceptable ]

由于python没有switch-case语句,因此可以使用以下函数作为switch-case。您可以根据需要实现函数返回逻辑。由于每次都要追加行,因此此函数每次都返回相同的行

弗林: 返回{ “sameDay”:行, “三天佐料”:台词, “weekAgo”:行, “monthAgo”:行, “三天佐料”:行 }格特琳先生 袋子=[] 对于行中的行: 佩德弗林
在所有情况下,都要追加行。那么分开付账有什么用呢?您可以使用一个if-check来检查行是否等于任何天/周/月,并附加变量,。。。是字符串类型吗?@rusu_ro1它们是“datetime.date”,但AwakedHakis解决方案是有效的。我认为几乎所有其他答案都会有效。与创建列表然后输出相比,生成的内存效率更高。这是由于内置于yield和generators中的惰性评估。另外,如果您确实想创建一个列表而不是生成器,请调用listcheck\u变量。。。实际上比在内部调用append要快。如果行不匹配,则给出KeyError。相反,请在字典上使用get方法,这样不会引发异常。
acceptable = {str(e) for e in [sameDay, threeDaysAgo, monthAgo, hreeDaysAgo]}
with open('stuff.txt', 'r') as f:
    bag = [line for line in f.readlines() if line in acceptable ]