【问题标题】:Convert a list of strings and lists into a list of chars and lists?将字符串和列表的列表转换为字符和列表的列表?
【发布时间】:2015-08-25 14:35:20
【问题描述】:

我有一个字符串和变量列表。例如:

['oz_', A, 'ab'],其中 A 是一个列表,我不希望它发生任何事情。

我想把它转换成:

['o','z','_', A, 'a', 'b']

A 是一个列表,所以我不想更改它。我该怎么做?

【问题讨论】:

  • 该列表包含对对象的引用。仅给定列表,您无法判断这些引用是来自变量还是字符串文字。

标签: python list split


【解决方案1】:

如果是字符串,您需要遍历每个元素并将其转换为列表,否则将其保留为变量并附加它。

source = ['oz_', A, 'ab']
result = []

for name in source:
    if isinstance(name, str):
        result += name
    else:
        result.append(name)

注意:如果您想考虑其他类型的字符串(如 unicode),请在 Python2.x 中使用 isinstance(name, basetring)

【讨论】:

    【解决方案2】:

    更新现在我们知道 A 不会被改变。

    A = []
    seq = ['oz_', A, 'ab']
    
    res = []
    for elt in seq:
        if isinstance(elt, str):
            for e in list(elt):
                res.append(e)
        else:
            res.append(elt)
    print(res)
    

    输出:

    ['o', 'z', '_', [], 'a', 'b']
    

    【讨论】:

      【解决方案3】:

      强制单行:

      >>> A = []
      >>> seq = ['oz_', A, 'ab']
      
      >>> [value for values in seq
      ...  for value in (values if isinstance(values, str)
      ...                else [values])]
      ['o', 'z', '_', [], 'a', 'b']
      

      【讨论】:

      • 谢谢。我正在寻找这样的答案。
      【解决方案4】:

      为了将字符串列表转换为字符列表,我看到了两种方法:

      1. 要么使用列表推导式,从字面上包含每个字符串的每个字符:

        >>> lst = ['oz_', 'A', 'ab']
        >>> [char for string in lst for char in string]
        ['o', 'z', '_', 'A', 'a', 'b']
        
      2. 或者join字符串并将结果变成一个列表:

        >>> list(''.join(lst))
        ['o', 'z', '_', 'A', 'a', 'b']
        

      如果A 是一个变量,而您想保留它,事情就会变得更加棘手。如果A 是一个字符串,那么这是不可能的,因为A 将被评估,然后与其他字符串无法区分。如果是别的东西,那么你将不得不区分这两种类型:

      >>> joined = []
      >>> for x in lst:
      ...     joined += x if isinstance(x, str) else [x] # +x extends, +[x] appends
      

      【讨论】:

        【解决方案5】:

        如果列表的完整元素是字符串,您可以使用 itertools.chain.from_iterable() ,它需要一个可迭代对象(如列表/元组等),然后对于其中的每个可迭代元素,它会创建一个由元素组成的新列表那些内部迭代(在这种情况下是字符串)。示例 -

        In [5]: lst = ['oz_', 'A', 'ab']
        
        In [6]: list(chain.from_iterable(lst))
        Out[6]: ['o', 'z', '_', 'A', 'a', 'b']
        

        如更新的问题中所述 -

        A 是一个列表,所以我不想改变它。

        您可以这样做(类似于@SuperBiasedMan 的建议)(对于 Python 3.x)-

        In [14]: lst = ['oz_', 'A', 'ab',[1,2,3]]
        
        In [15]: ret = []
        
        In [18]: for i in lst:
           ....:     if isinstance(i, str):
           ....:         ret.extend(i)
           ....:     else:
           ....:         ret.append(i)
           ....:
        
        In [19]: ret
        Out[19]: ['o', 'z', '_', 'A', 'a', 'b', [1, 2, 3]]
        

        您可以在 Python 2.x 中使用 basestring 来处理 unicode 和普通字符串。

        还请注意,上述方法不检查列表中的特定对象是否来自变量,它只是将字符串分解为字符,对于所有其他类型,它保持原样。

        【讨论】:

          【解决方案6】:
          >>> [a for a in ''.join(['oz_', 'A', 'ab'])]
          ['o', 'z', '_', 'A', 'a', 'b']
          

          【讨论】:

          • @JamesSmith OP 希望将 A 保留为变量,而不是字符串。
          • 那么就做A = [a for a in ''.join(['oz_', 'A', 'ab'])]
          【解决方案7】:

          无论哪种方式,您都可以使用chain.from_iterable,您只需将非字符串包装在一个列表中:

          from itertools import chain
          
          out = list(chain.from_iterable([sub] if not isinstance(sub, str) else sub for sub in l))
          

          【讨论】:

            猜你喜欢
            • 2020-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-25
            • 2022-09-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多