【问题标题】:How do I append a list with sublists inside of it?如何附加一个包含子列表的列表?
【发布时间】:2018-09-13 18:11:42
【问题描述】:

我需要做的就是创建 1 个包含所有这些值的列表,没有子列表。

example = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
newArray = []

def func(array):
    for i in array:
        for z in i:
            newArray.append(z)

print(func(example))

这里的结果是:['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}]。 当我添加 3rd 时,它会说“int”对象是不可迭代的。我是否需要以某种方式检查该项目是 int 还是 string 然后跳过它们?还是我错过了什么?

附:我相信这是通过递归函数完成的,但我对它们一无所知:(

【问题讨论】:

  • extend

标签: python list


【解决方案1】:

这里是一个递归函数的例子,可以让你的列表变平:

def flatten(l):
    if type(l) is list:
        if not l:
            return []
        if len(l) == 1 :
            return flatten(l[0])
        else:
            return flatten(l[0]) + flatten(l[1:])
    else:
        return [l]

结果是 ['a', 'c', 1, 3, 'f', 7, 4, '4', {'lalala': 111}]

【讨论】:

  • 我不认为想要的输出是 ['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}] 因为作者的功能已经做到了
【解决方案2】:

使用递归函数。享受吧!

代码:

example = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
newArray = [] 

def super_extend(v):
        if type(v) is list:
            [super_extend(x) for x in v if x is not None]
        if type(v) is dict:
            {k:super_extend(v) for k,v in v.items() if v is not None}
        if type(v) is str or isinstance(v, int) or isinstance(v, float) :
            newArray.append(v)

super_extend(example)
print(newArray)

输出:

['a', 'c', 1, 3, 'f', 7, 4, '4', 111]
[Finished in 0.078s]

如果您不希望字典保留为字典而只需要值。你可以使用这个。但是,如果您想保留密钥,您只需使用:

if type(v) is dict:
        {super_extend(v):super_extend(k) for k,v in v.items() if v is not None}

那么输出将是:

['a', 'c', 1, 3, 'f', 7, 4, '4', 'lalala', 111]
[Finished in 0.077s]

【讨论】:

  • @roganjosh,这是我运行他的代码时他的当前结果。这不是他想要的输出。他没有发布他想要的输出,他明确表示他想扩展更多,但添加第三个循环正在运行,错误是迭代整数,这是不可能的。他还添加了我确实使用过的递归函数的可能用途。
【解决方案3】:

使用递归生成器函数:

def flatten(l):
    if isinstance(l, list):
        for x in l:
            yield from flatten(x)
    else:
        yield l

>>> list(flatten(example))
['a', 'c', 1, 3, 'f', 7, 4, '4', {'lalala': 111}]

【讨论】:

  • @Taras 这应该是公认的答案。如果您使用 python 3.3+,比我的解决方案优雅得多(但应该在答案中提及)
【解决方案4】:

列出方法

list 对象提供了两种不同的方法来向给定的list 添加新项目:

  1. list.append(x): 将项目添加到列表末尾。等价于 a[len(a):] = [x]。

  2. list.extend(iterable):通过附加来自可迭代对象的所有项目来扩展列表。等价于 a[len(a):] = iterable。

示例

old_list = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
new_list = []

for element in old_list:
    new_list.extend(element)

print(new_list)

结果

['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}]

【讨论】:

    【解决方案5】:

    也许你正在寻找这样的东西:

    example = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
    
    def func(array):
        newArray = []
        for i in array:
            if((type(i)==int) or (type(i)==str)):
                newArray.append(i)
            elif(type(i)==dict ):
                keys = i.keys()
                values = i.values()
                newArray.append(keys[0])
                newArray.append(values[0])
            else:
                for z in i:            
                    newArray.append(z)
        return newArray
    
    print(func(example))
    print(func(func(example)))
    print(func(func(func(example))))
    

    结果:

    ['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}]
    ['a', 'c', 1, 3, 'f', 7, 4, '4', 'lalala', 111]
    ['a', 'c', 1, 3, 'f', 7, 4, '4', 'lalala', 111]
    

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 2022-12-31
      • 2021-03-06
      • 2020-03-27
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多