【问题标题】:Python function loop through each list value and insert into stringPython函数循环遍历每个列表值并插入字符串
【发布时间】:2021-03-01 01:46:33
【问题描述】:

我有一个值列表,我想循环并插入到""" 字符串语句中。但我是 for 循环的新手,不完全确定有效插入列表值的最佳方法是什么。

我有一个清单 -

subqueries = ['name','name2','name3']

还有一个字符串语句-

"""SELECT * FROM <insert name from list here> WHERE id=weather"""

要插入名称,我想创建一个这样的函数 -

def sub_view(qry, subqueries):
    qry_list = []
    for sub in subqueries:
        qry_list = qry + """SELECT * FROM""" + subqueries + """ WHERE id=weather"""
    return qry_list

得到-

name = qry + """SELECT * FROM name WHERE id=weather"""
name2 = qry + """SELECT * FROM name2  WHERE id=weather"""
name3 = qry + """SELECT * FROM name3 WHERE id=weather"""

我怎样才能有效地做到这一点?

【问题讨论】:

  • 可能先读 f 个字符串?

标签: python string function for-loop


【解决方案1】:
subqueries1 = ['name','name2','name3']

def sub_view(qry, subqueries):
  qry_list = []
  for sub in subqueries:
    qry_list.append(qry + """SELECT * FROM""" + sub + """ WHERE id=weather""")
  return qry_list
  
  
x=sub_view('qry',subqueries1)
for i in x:
  print(i)

【讨论】:

    【解决方案2】:

    您可以使用f strings。您的函数也有一个小错误,更正和格式化的版本是:

    def sub_view(qry, subqueries):
        qry_list = []
        for sub in subqueries:
            qry_list = f"{qry} SELECT * FROM {sub} WHERE id=weather"
            return qry_list
    

    【讨论】:

    • 这些是非常有用的答案,我怎样才能将它们单独分解?像 name、name2、name3 变量?
    • 您能再描述一下吗?你把它们单独分开是什么意思?我猜,您不知道访问列表元素。调用您的函数并将其分配给一个值:my_queries = sub_view(qry, subqueries) print(my_queries[0]) # name print(my_queries[1]) # name2
    • 所以每个子查询都成为它自己的字符串变量,试图在问题描述的输出中将其分解
    【解决方案3】:

    您可以使用格式字符串,在开始字符串之前使用“f”,并使用您的变量 在{} 里面,像这样:{sub}, 然后使用.append() 函数添加到您的列表中。

    for sub in subqueries:
        qry_list.append(qry + f"SELECT * FROM {sub} WHERE id=weather")
    

    【讨论】:

      【解决方案4】:

      你可以像这样使用“lambda”:

      def sub_view(qry, subqueries):
          return list(map(lambda s: qry + """SELECT * FROM """ + s + """ WHERE id=weather""", subqueries))
      

      你也可以像这样使用“for”:

      def sub_view(qry, subqueries):
          qry_list = []
          for sub in subqueries:
              #qry_list.append(qry + """SELECT * FROM """ + sub + """ WHERE id=weather""")
              qry_list.append("""%s SELECT * FROM %s WHERE id = weather""" % (qry, sub))
          return qry_list
      

      【讨论】:

        【解决方案5】:

        不清楚您的目标是什么,因为查询字符串看起来没那么有用,但是,您可以使用列表推导式创建一个包含替换的查询列表:

        def sub_view(qry, subqueries):
            return [f"{qry} SELECT * FROM {table} WHERE id='weather'" for table in subqueries]
        
        >>> subqueries = ['name','name2','name3']
        >>> sub_view('Some prefix string', subqueries)
        ["Some prefix string SELECT * FROM name WHERE id='weather'", "Some prefix string SELECT * FROM name2 WHERE id='weather'", "Some prefix string SELECT * FROM name3 WHERE id='weather'"]
        

        这将返回一个列表。要将每个查询绑定到一个变量,您需要知道列表中有多少项目及其顺序。你可以像这样手动编码:

        >>> name, name2, name3 = sub_view('Some prefix string', subqueries)
        >>> name
        "Some prefix string SELECT * FROM name WHERE id='weather'"
        >>> name2
        "Some prefix string SELECT * FROM name2 WHERE id='weather'"
        >>> name3
        "Some prefix string SELECT * FROM name3 WHERE id='weather'"
        

        鉴于您需要事先了解变量计数,您可以使用该列表。称它为names 并按索引引用“变量”:

        >>> names = sub_view('Some prefix string', subqueries)
        >>> names[0]
        "Some prefix string SELECT * FROM name WHERE id='weather'"
        >>> names[1]
        "Some prefix string SELECT * FROM name2 WHERE id='weather'"
        ...
        

        或者使用字典推导来创建字典:

        def sub_view(qry, subqueries):
            return {table: f"{qry} SELECT * FROM {table} WHERE id='weather'" for table in subqueries}
        
        >>> queries = sub_view('Some prefix string', subqueries)
        >>> queries
        {'name': "Some prefix string SELECT * FROM name WHERE id='weather'", 'name2': "Some prefix string SELECT * FROM name2 WHERE id='weather'", 'name3': "Some prefix string SELECT * FROM name3 WHERE id='weather'"}
        
        >>> queries['name']
        "Some prefix string SELECT * FROM name WHERE id='weather'"
        >>> queries['name2']
        "Some prefix string SELECT * FROM name2 WHERE id='weather'"
        ...
        

        最后一个示例可能最接近您想要的。它将处理任意数量的查询,您仍然可以通过使用名称作为字典查找的键来访问各个查询。

        【讨论】:

        • 谢谢,目标对我很有帮助……我想没有更自动化的方法来循环和创建这些字符串变量?
        • 单行列表或字典理解尽可能简洁和自动化。字典理解可能是最好的:它采用表/子查询列表和qry 值并返回一个字典,您可以使用该字典按子查询列表中提供的名称查找字符串。通过变量名访问结果需要与字典完全相同的信息量,并且需要额外的代码来执行分配,因此这样做没有自动化优势。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 2019-09-02
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        相关资源
        最近更新 更多