【问题标题】:How would you make a comma-separated string from a list of strings?你将如何从字符串列表中创建一个逗号分隔的字符串?
【发布时间】:2021-09-26 12:36:50
【问题描述】:

从一个序列中连接字符串的首选方法是什么,以便在每两个连续对之间添加一个逗号。也就是说,您如何将['a', 'b', 'c'] 映射到'a,b,c'? (['s'] 和[] 的情况应分别映射到's' 和''。)

我通常最终会使用''.join(map(lambda x: x+',',l))[:-1] 之类的东西,但也觉得有些不满意。

【问题讨论】:

标签: python string list


【解决方案1】:

mmm 还需要 SQL 是:

l = ["foo" , "baar" , 6]
where_clause = "..... IN ("+(','.join([ f"'{x}'" for x in l]))+")"
>> "..... IN ('foo','baar','6')"

享受

【讨论】:

    【解决方案2】:

    如果你想走捷径:):

    ','.join([str(word) for word in wordList])
    

    但如果你想用逻辑炫耀:) :

    wordList = ['USD', 'EUR', 'JPY', 'NZD', 'CHF', 'CAD']
    stringText = ''
    
    for word in wordList:
        stringText += word + ','
    
    stringText = stringText[:-2]   # get rid of last comma
    print(stringText)
    

    【讨论】:

      【解决方案3】:
      my_list = ['a', 'b', 'c', 'd']
      my_string = ','.join(my_list)
      
      'a,b,c,d'
      

      如果列表包含整数,这将不起作用


      如果列表包含非字符串类型(例如整数、浮点数、布尔值、无),则执行以下操作:

      my_string = ','.join(map(str, my_list)) 
      

      【讨论】:

      • 请注意,如果您使用的是 python 2.7(您现在不应该这样做),那么如果列表中的任何项目具有 unicode,使用 str 将引发异常。
      • 我的要求是填写 SQL“WHERE x NOT IN ()”子句。 join() 函数将在元素之间插入您喜欢的任何字符串,但对列表的每一端都不做任何事情。所以这有效: nameString = '"{}"'.format('", "'.join(nameList)) 这些是包含所需双引号字符串的单引号。 Python 3.7
      • 为什么python没有专业的函数来执行这个操作?
      • 值得注意的是,这个答案是在 13 年前发布的。我猜从那时起,Python 发生了很多变化。
      【解决方案4】:

      为什么要使用map/lambda 魔法?这不行吗?

      >>> foo = ['a', 'b', 'c']
      >>> print(','.join(foo))
      a,b,c
      >>> print(','.join([]))
      
      >>> print(','.join(['a']))
      a
      

      如果列表中有数字,您可以使用列表推导:

      >>> ','.join([str(x) for x in foo])
      

      或生成器表达式:

      >>> ','.join(str(x) for x in foo)
      

      【讨论】:

        【解决方案5】:

        我想说csv 库是这里唯一明智的选择,因为它是为应对所有 csv 用例而构建的,例如字符串中的逗号等。

        要将列表l 输出到 .csv 文件:

        import csv
        with open('some.csv', 'w', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(l)  # this will output l as a single row.  
        

        也可以使用writer.writerows(iterable)将多行输出到csv。

        此示例与 Python 3 兼容,因为此处的另一个答案使用了 StringIO,即 Python 2。

        【讨论】:

        • 但是与其他答案相比,这不是太多/复杂吗?
        【解决方案6】:

        我的两分钱。我喜欢更简单的python中的一行代码:

        >>> from itertools import imap, ifilter
        >>> l = ['a', '', 'b', 1, None]
        >>> ','.join(imap(str, ifilter(lambda x: x, l)))
        a,b,1
        >>> m = ['a', '', None]
        >>> ','.join(imap(str, ifilter(lambda x: x, m)))
        'a'
        

        它是 Pythonic,适用于字符串、数字、None 和空字符串。它很短,满足要求。如果列表不包含数字,我们可以使用这个更简单的变体:

        >>> ','.join(ifilter(lambda x: x, l))
        

        此外,此解决方案不会创建新列表,而是使用迭代器,就像 @Peter Hoffmann 指出的那样(谢谢)。

        【讨论】:

        • 这是多余的。公认的答案是简单、直接且显然是最佳解决方案。提供过于复杂的替代方案是对时间的毫无意义的浪费。如果您只是在已经有可行答案的情况下尝试了解该语言的其他功能,那么您正在做的事情与您对我的反对意见相同。
        【解决方案7】:
        >>> my_list = ['A', '', '', 'D', 'E',]
        >>> ",".join([str(i) for i in my_list if i])
        'A,D,E'
        

        my_list 可以包含任何类型的变量。这避免了结果'A,,,D,E'。

        【讨论】:

          【解决方案8】:

          这是一个列表示例

          >>> myList = [['Apple'],['Orange']]
          >>> myList = ','.join(map(str, [i[0] for i in myList])) 
          >>> print "Output:", myList
          Output: Apple,Orange
          

          更准确:-

          >>> myList = [['Apple'],['Orange']]
          >>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
          >>> print "Output:", myList
          Output: Apple,Orange
          

          示例 2:-

          myList = ['Apple','Orange']
          myList = ','.join(map(str, myList)) 
          print "Output:", myList
          Output: Apple,Orange
          

          【讨论】:

          • 这个问题是关于列表的,而不是列表列表。
          • @EeroAaltonen 我更新了我的答案,感谢您指出我的正确方向。
          【解决方案9】:

          ",".join(l) 不适用于所有情况。我建议使用带有 StringIO 的 csv 模块

          import StringIO
          import csv
          
          l = ['list','of','["""crazy"quotes"and\'',123,'other things']
          
          line = StringIO.StringIO()
          writer = csv.writer(line)
          writer.writerow(l)
          csvcontent = line.getvalue()
          # 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n'
          

          【讨论】:

          • Python 3 中没有StringIO
          • @RonKalian 在 Python 3 中使用 from io import StringIO
          【解决方案10】:
          l=['a', 1, 'b', 2]
          
          print str(l)[1:-1]
          
          Output: "'a', 1, 'b', 2"
          

          【讨论】:

          • 我认为您应该指出,与此页面上的其他解决方案不同,您也引用了字符串。
          【解决方案11】:

          你不想吗:

          ",".join(l)
          

          如果您需要在值中引用/转义逗号等,显然会变得更加复杂。在这种情况下,我建议查看标准库中的 csv 模块:

          https://docs.python.org/library/csv.html

          【讨论】:

            【解决方案12】:

            这是 Python 3.0 中允许非字符串列表项的替代解决方案:

            >>> alist = ['a', 1, (2, 'b')]
            
            • 标准方法

              >>> ", ".join(map(str, alist))
              "a, 1, (2, 'b')"
              
            • 替代解决方案

              >>> import io
              >>> s = io.StringIO()
              >>> print(*alist, file=s, sep=', ', end='')
              >>> s.getvalue()
              "a, 1, (2, 'b')"
              

            注意:逗号后面的空格是故意的。

            【讨论】:

              【解决方案13】:

              @彼得霍夫曼

              使用生成器表达式的好处是还可以生成迭代器,但可以节省导入 itertools。此外,列表推导通常优于 map,因此,我希望生成器表达式优于 imap。

              >>> l = [1, "foo", 4 ,"bar"]
              >>> ",".join(str(bit) for bit in l)
              '1,foo,4,bar' 
              

              【讨论】:

                【解决方案14】:

                @jmanning2k 使用列表推导具有创建新临时列表的缺点。更好的解决方案是使用返回迭代器的 itertools.imap

                from itertools import imap
                l = [1, "foo", 4 ,"bar"]
                ",".join(imap(str, l))
                

                【讨论】:

                • 此解决方案不满足空字符串不添加额外逗号和使用 NoneType 添加 'None' 的要求。
                • check str.join 与生成器相比,list 工作得更快
                【解决方案15】:

                除非我遗漏了什么,','.join(foo) 应该按照您的要求去做。

                >>> ','.join([''])
                ''
                >>> ','.join(['s'])
                's'
                >>> ','.join(['a','b','c'])
                'a,b,c'
                

                (编辑:正如 jmanning2k 指出的那样,

                ','.join([str(x) for x in foo])
                

                更安全且相当 Pythonic,尽管如果元素可以包含逗号,则生成的字符串将难以解析——此时,您需要 csv 模块的全部功能,正如 Douglas 在他的回答中指出的那样。 )

                【讨论】:

                  猜你喜欢
                  • 2022-10-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-06
                  • 2017-04-10
                  相关资源
                  最近更新 更多