【问题标题】:How to use print() along with other operations in list comprehension? [duplicate]如何在列表理解中使用 print() 以及其他操作? [复制]
【发布时间】:2017-03-17 10:16:39
【问题描述】:

我有一个 CSV 数据文件目录,我在列表理解语句中使用 pandas.read_csv() 将所有这些文件加载​​到一行中。

import glob
import pandas as pd
file_list = glob.glob('../data/')
df_list = [pd.read_csv(f) for f in file_list]
df = pd.concat(df_list, ignore_index=True)

现在我想在每次加载数据文件时打印文件路径,但我找不到在列表理解中使用多个语句的方法。例如,[pd.read_csv(f); print(f) for f in file_list] 之类的内容将导致 SyntaxError

我能得到的最接近的方法是让 print() 在 if 语句中返回 None,它在打印后就像 pass 一样工作。

df_list = [pd.read_csv(f) for f in file_list if print(f) is None]

有没有合适的方法来做到这一点?我喜欢列表推导的简洁性,但它似乎不允许多个语句。

【问题讨论】:

    标签: python list-comprehension


    【解决方案1】:

    如果您想要一个列表理解(考虑到 for 循环的速度改进,这是可以理解的),您可以稍微修改您的解决方案,因为 None 是错误的:

    df_list = [pd.read_csv(f) for f in file_list if not print(f)]
    

    或者创建一个可以完成工作的函数:

    def read_and_print(f):
        print(f)
        return pd.read_csv(f)
    
    df_list = [read_and_print(f) for f in file_list]
    

    但是,这些方法违反了 Python 通常遵循的命令-查询分离原则,因为该函数既有副作用又有return 感兴趣的值。尽管如此,我认为这些都是非常实用的,特别是如果您现在想print() 查看数据,但稍后您计划删除print() 调用。

    【讨论】:

    • 有人知道解释 bool(print("hey")) 的资源吗?它总是会评估 Falsy(我认为),因为它没有返回任何东西
    • @BrendanMetcalfe print() 返回 None,这是错误的。试试p = print(1); print(p)
    【解决方案2】:

    列表理解不是为此而设计的。相反,只是为了填充一个循环遍历一些可迭代的列表,并且(可选地)如果满足条件。 Python 喜欢强调代码的可读性。

    做你想做的事的正确方法是根本不使用列表推导,而是使用 for 循环:

    for f in file_list:
        print(f)
        df_list.append(pd.read_csv(f))
    

    【讨论】:

      【解决方案3】:

      如前所述,您通常不应在列表推导中使用具有副作用的函数。但是,我很欣赏出于调试目的这样的东西可能有用。

      类似于if 条件的一种方法是使用or,利用print 函数返回None 的事实,从而评估并返回第二个运算符:

      df_list = [print(f) or pd.read_csv(f) for f in file_list]
      

      但这可能很难理解,意图也不是很清楚。或者,您可以定义一个 peek 函数来打印并返回参数并在理解中使用它:

      def peek(x, *args, **kwargs):
          print(x, *args, **kwargs)
          return x
      
      df_list = [pd.read_csv(peek(f)) for f in file_list]
      

      您也可以使这个更通用,将要应用的函数(在本例中为print)作为另一个参数传递给peek 函数,或者首先检查某个全局debug_enabled 变量是否实际设置为@ 987654331@.

      【讨论】:

        猜你喜欢
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        相关资源
        最近更新 更多