【问题标题】:PYTHON-Merge single elements in list with sublistPYTHON-将列表中的单个元素与子列表合并
【发布时间】:2014-08-20 08:33:12
【问题描述】:

我尝试制作平面列表。现在我有列表:

L=['aa',['bb','cc']]

我试试:

L=['aa',['bb','cc']]
new=[]

for i in L:
  print i
  new+=i

print new

我得到了:

'aa'

['bb','cc']

['a','a','bb','cc']

为什么print i=0 = 'aa'new+=i i=0 中只有“a”?

我如何获得列表['aa','bb','cc']

【问题讨论】:

  • 你需要避免遍历字符串;请参阅我的答案here,它以递归方式和特殊情况下的字符串工作。
  • 问题是你的 += 期望在等式的两边都可以迭代,并用右边扩展左边,在你的情况下右边是'aa',它被视为两个可迭代的元素,如 [' a', 'a']

标签: python


【解决方案1】:

一般来说,意思是当您不知道原始列表的深度时,这应该可以:

L=['aa',['bb','cc', ['dd', 'ee']], 'ff']
new = []
for l_item in L:
    stack = [ l_item ]
    while stack:
        s_item = stack.pop(0)
        if isinstance(s_item, list):
            stack += [ x for x in s_item ]
        else:
            new.append(s_item)
print new 

这给出了:

['aa', 'bb', 'cc', 'dd', 'ee', 'ff']

【讨论】:

    【解决方案2】:

    好吧,别忘了字符串在 Python 中是可迭代的。

    >>> new = []
    >>> new += 'aa'
    >>> print new
    ['a', 'a']
    

    为了确保添加您想要的内容,您可以这样进行:

    >>> L = ['aa',['bb','cc']]
    >>> new = []
    
    >>> for e in L:
    ...     new.extend(e if type(e) == list else (e,))
    >>> print new
    ['aa', 'bb', 'cc']
    

    说真的,


    附:您可以查看this post ... 了解更多信息。

    【讨论】:

      【解决方案3】:

      发生这种情况是因为您迭代了 'aa',基本上将其视为 ['a', 'a']

      如果你想避免遍历字符串,你可以看一下类型:

      for i in L:
          if isinstance(i, list):
              new += i
          else:
              new.append(i)
      

      有关更多详细信息以及如何递归执行此问题,请参阅此问题:

      Flatten (an irregular) list of lists

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 2018-04-11
        • 2022-09-30
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2023-01-08
        相关资源
        最近更新 更多