【问题标题】:How to convert a string with comma-delimited items to a list in Python?如何将带有逗号分隔项的字符串转换为 Python 中的列表?
【发布时间】:2011-07-20 05:19:29
【问题描述】:

如何将字符串转换为列表?

假设字符串类似于text = "a,b,c"。转换后,text == ['a', 'b', 'c'],希望text[0] == 'a'text[1] == 'b'

【问题讨论】:

    标签: python string list


    【解决方案1】:

    像这样:

    >>> text = 'a,b,c'
    >>> text = text.split(',')
    >>> text
    [ 'a', 'b', 'c' ]
    

    【讨论】:

    • 这不是一个数组,它是一个列表,数组代表基本的值并且表现得非常像列表,只是其中存储的对象的类型受到限制。
    • 友情提醒:不要使用eval,即使你相信字符串是安全的。除了个人脚本和摆弄交互式 shell 之外,任何潜在的安全隐患都不值得。
    • eval('[' + text + ']') 将 a,b,c 视为变量,而不是字符串。
    • 被否决,因为这两个提议的解决方案做的事情完全不同,答案文本中没有以任何方式解释这一点。虽然问题本身并不是很清楚,但应该在答案中明确说明这两种解决方案不是等效的替代方案,而是对问题的不同解释。
    【解决方案2】:

    如果你真的想要数组:

    >>> from array import array
    >>> text = "a,b,c"
    >>> text = text.replace(',', '')
    >>> myarray = array('c', text)
    >>> myarray
    array('c', 'abc')
    >>> myarray[0]
    'a'
    >>> myarray[1]
    'b'
    

    如果您不需要数组,而只想按索引查看字符,请记住字符串是可迭代的,就像列表一样,只是它是不可变的:

    >>> text = "a,b,c"
    >>> text = text.replace(',', '')
    >>> text[0]
    'a'
    

    【讨论】:

    • 出于好奇,在你做了 myarray = array('c', text) 之后,“c”去了哪里?因为如果你输入数组,你会得到数组(“c”,“abc”),但是 a[0]==a?谢谢
    • @Clinteney:“c”的意思是“创建一个字符数组”。请参阅the docs 了解更多信息
    • 我投了赞成票,但为时过早。我在调用 a = array('c',e) where e = "1 时获得 array('c', '1 1 91 0.001 228') 1 91 0.001 228"
    • @ValentinHeinitz 是的,这就是你必须得到的,如我的示例所示。你期待什么?
    • @joaquin:好的,我明白了。有了答案就没事了。我对“text == [a,b,c]”应该是“text == ['a','b','c']”的问题感到困惑
    【解决方案3】:

    我通常使用:

    l = [ word.strip() for word in text.split(',') ]
    

    strip 删除单词周围的空格。

    【讨论】:

      【解决方案4】:
      # to strip `,` and `.` from a string ->
      
      >>> 'a,b,c.'.translate(None, ',.')
      'abc'
      

      您应该对字符串使用内置的translate 方法。

      在 Python shell 中键入 help('abc'.translate) 以获取更多信息。

      【讨论】:

        【解决方案5】:

        以下 Python 代码会将您的字符串转换为字符串列表:

        import ast
        teststr = "['aaa','bbb','ccc']"
        testarray = ast.literal_eval(teststr)
        

        【讨论】:

        • 他们也可以使用json 例如:json.loads(teststr)
        • @MohammadNazari 您的解决方案仅在字符串中使用双引号来包围数组的实际值时才有效。
        【解决方案6】:

        只是补充现有的答案:希望您将来会遇到更多类似的事情:

        >>> word = 'abc'
        >>> L = list(word)
        >>> L
        ['a', 'b', 'c']
        >>> ''.join(L)
        'abc'
        

        但是您正在处理的现在,请使用@Cameron 的答案。

        >>> word = 'a,b,c'
        >>> L = word.split(',')
        >>> L
        ['a', 'b', 'c']
        >>> ','.join(L)
        'a,b,c'
        

        【讨论】:

        • 虽然我同意你的看法,@Cameron 的答案是“现在”的答案,但我认为你的彻底性使这个答案更正确。在现实世界中我们很少得到逗号分隔的字符串,知道如何转换为列表而不考虑格式是件好事。
        【解决方案7】:

        使用函数式 Python:

        text=filter(lambda x:x!=',',map(str,text))
        

        【讨论】:

          【解决方案8】:

          我认为你需要

          在python中你很少需要将字符串转换为列表,因为字符串和列表非常相似

          改变类型

          如果你真的有一个字符串应该是一个字符数组,这样做:

          In [1]: x = "foobar"
          In [2]: list(x)
          Out[2]: ['f', 'o', 'o', 'b', 'a', 'r']
          

          不改变类型

          请注意,字符串非常类似于 python 中的列表

          字符串有访问器,比如列表

          In [3]: x[0]
          Out[3]: 'f'
          

          字符串是可迭代的,就像列表一样

          In [4]: for i in range(len(x)):
          ...:     print x[i]
          ...:     
          f
          o
          o
          b
          a
          r
          

          TLDR

          字符串是列表。差不多了。

          【讨论】:

          • 这个问题好像没有被真正理解
          【解决方案9】:

          如果你想用空格分割,你可以使用.split()

          a = 'mary had a little lamb'
          z = a.split()
          print z
          

          输出:

          ['mary', 'had', 'a', 'little', 'lamb'] 
          

          【讨论】:

          • 这会输出()之间的内容,即什么都没有。
          【解决方案10】:

          要转换具有a="[[1, 3], [2, -6]]" 形式的string,我编写了尚未优化的代码:

          matrixAr = []
          mystring = "[[1, 3], [2, -4], [19, -15]]"
          b=mystring.replace("[[","").replace("]]","") # to remove head [[ and tail ]]
          for line in b.split('], ['):
              row =list(map(int,line.split(','))) #map = to convert the number from string (some has also space ) to integer
              matrixAr.append(row)
          print matrixAr
          

          【讨论】:

            【解决方案11】:
            m = '[[1,2,3],[4,5,6],[7,8,9]]'
            
            m= eval(m.split()[0])
            
            [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
            

            【讨论】:

            • 请提供一些附加信息以及您的代码,以便原始发布者能够更好地理解这如何解决他的问题。
            【解决方案12】:

            所有答案都很好,还有另一种方法,即列表理解,请参阅下面的解决方案。

            u = "UUUDDD"
            
            lst = [x for x in u]
            

            对于逗号分隔的列表,请执行以下操作

            u = "U,U,U,D,D,D"
            
            lst = [x for x in u.split(',')]
            

            【讨论】:

            【解决方案13】:

            示例 1

            >>> email= "myemailid@gmail.com"
            >>> email.split()
            #OUTPUT
            ["myemailid@gmail.com"]
            

            示例 2

            >>> email= "myemailid@gmail.com, someonsemailid@gmail.com"
            >>> email.split(',')
            #OUTPUT
            ["myemailid@gmail.com", "someonsemailid@gmail.com"]
            

            【讨论】:

              【解决方案14】:

              split() 是你的朋友。我将介绍split() 的一些其他答案未涵盖的方面。

              • 如果没有参数传递给split(),它将根据空白字符(空格、制表符和换行符)拆分字符串。前导和尾随空格被忽略。此外,连续的空格被视为单个分隔符。

              例子:

              >>> "   \t\t\none  two    three\t\t\tfour\nfive\n\n".split()
              ['one', 'two', 'three', 'four', 'five']
              
              • 当传递单个字符分隔符时,split() 的行为与其默认行为完全不同。在这种情况下,前导/尾随定界符不会被忽略,重复定界符也不会“合并”成一个。

              例子:

              >>> ",,one,two,three,,\n four\tfive".split(',')
              ['', '', 'one', 'two', 'three', '', '\n four\tfive']
              

              因此,如果在基于非空白分隔符拆分字符串时需要去除空白,请使用以下构造:

              words = [item.strip() for item in string.split(',')]
              
              • 当多字符串作为分隔符传递时,它被视为单个分隔符,而不是字符类或一组分隔符。

              例子:

              >>> "one,two,three,,four".split(',,')
              ['one,two,three', 'four']
              

              要将多个分隔符合并为一个,您需要使用re.split(regex, string) 方法。请参阅下面的相关帖子。


              相关

              【讨论】:

                猜你喜欢
                • 2011-12-12
                • 1970-01-01
                • 2023-04-02
                • 2013-02-04
                • 1970-01-01
                • 2022-01-21
                • 1970-01-01
                • 1970-01-01
                • 2021-01-23
                相关资源
                最近更新 更多