【问题标题】:not able to add extra values in a list using for loop in python无法在 python 中使用 for 循环在列表中添加额外的值
【发布时间】:2018-02-03 07:55:05
【问题描述】:

我需要编写一个函数,它接受一个参数,一个字符串列表,并返回一个字符串,它是一个 HTML 列表。例如,如果函数在提供列表 ['first string]', 'second string'] 时应该生成以下字符串,则结果应该是这样的

<ul>
  <li>first string</li>
  <li>second string</li>
</ul>

我使用的代码是

def new_func(value):
    capitalized_names = [] 
    capitalized_names.append("<ul>") 
    for values in value:
        capitalized_names.append("<li>" + values + "</li>") 
    capitalized_names.append("</ul>") 
    return capitalized_names

print(new_func(['first string', 'second string']))

它正在抛出错误

代码引发异常,“'list' 对象没有属性 'strip'”。

谁能告诉我实现结果的正确方法

【问题讨论】:

  • 似乎没有什么不对劲的地方,但为什么你的错误不在你的代码中时从strip 引发?是否有未显示的相关代码?你在剥什么?
  • 回溯应该告诉你错误发生在哪一行。但它不会是您发布的任何行。

标签: python list for-loop split


【解决方案1】:

当我尝试时,您的代码不会出现任何错误。它输出这个:

['<ul>', '<li>first string</li>', '<li>second string</li>', '</ul>']

您是否尝试过仅将此功能与其环境中的所有其他功能隔离开来并单独对其进行测试?错误可能来自除此脚本之外的其他地方。

如果你想要一个 html 列表,那么使用 python 列表是行不通的,而是使用 python 字符串。

def new_func(value):
capitalized_names = ""
capitalized_names+="<ul>" 
for values in value:
    capitalized_names+="<li>" + values + "</li>"
capitalized_names+="</ul>"
return capitalized_names

这应该输出

<ul><li>first string</li><li>second string</li></ul>

如果您希望空白(新行、缩进)看起来不错,那么您可以添加“\n”作为新行,并在缩进中添加空格:

for values in value:
    capitalized_names+="\n  <li>" + values + "</li>"
capitalized_names+="\n</ul>"

【讨论】:

    【解决方案2】:

    您的代码不能抛出该错误。请再次检查...您没有在任何地方的代码中使用 strip()。为了更整洁地在新行中获取每个列表项,请将您的代码修改为:

    def new_func(value):
    capitalized_names = [] 
    capitalized_names.append("<ul>") 
    for values in value:
        capitalized_names.append("    <li>" + values + "</li>") 
    capitalized_names.append("</ul>") 
    return '\n'.join(capitalized_names)
    
    print(new_func(['first string', 'second string']))
    

    【讨论】:

      【解决方案3】:

      您的代码不会引发错误(您甚至没有调用 strip),但是它确实返回了行的 list,而不是您要求的 string

      要获取string,可以一行完成:

      def html_list(l):
          return '<ul>\n\t' + '\n\t'.join('<li>'+s+'</li>' for s in l) + '\n</ul>'
      

      你应该能够看到,工作:

      >>> html_list(['first string', 'second string'])
      '<ul>\n\t<li>first string</li>\n\t<li>second string</li>\n</ul>'
      >>> print(html_list(['first string', 'second string']))
      <ul>
          <li>first string</li>
          <li>second string</li>
      </ul>
      

      为什么?

      第一步是创建一个generator,它将产生l 中的每个字符串 - 用&lt;li&gt; 标记包围。这可以很简单地使用comprehension

      >>> ['<li>'+s+'</li>' for s in l]
      ['<li>first string</li>', '<li>second string</li>']
      

      请注意,我在此示例中使用了 list-comprehension,但解决方案使用 generator,因为它们在内存方面更有效。

      然后,我们希望将这些修改后的字符串中的每一个与一个换行符 (\n) 和每个元素之间的制表符 (\t) 连接在一起。这可以通过str.join 轻松完成,其工作方式如下:

      >>> 'sep'.join(map(str, range(8)))
      '0sep1sep2sep3sep4sep5sep6sep7'
      

      最后一步是在这个形成的字符串周围添加&lt;ul&gt;标签,这给了我们类似的最终结果:

      '<ul>\n\t<li>first string</li>\n\t<li>second string</li>\n</ul>'
      

      当传递给print() 时,它会给你正确的输出。

      【讨论】:

      • 请问在join(l)之前使用点的原因,并且在第一个字符串和最后一个字符串之前和之后没有打开和关闭
      • 标签
    • @user3732711 我的错!我忘记了&lt;li&gt; 标签,我现在已经更新了代码,它仍然是一个不错的行
    • 猜你喜欢
      相关资源
      最近更新 更多
      热门标签