将N> = 1个元素附加到列表中

时间:2017-09-08 18:21:26

标签: python list append extend

我在python中构建一个列表,循环遍历一些JSON blob并附加元素。有时元素是单一的,有时是双重的(或更多)。

my_list = []    
for j in jsons:
  my_list.append(j['foo'])

my_list最终成为['a1', 'b1', ['c1', 'c2']]

如果我使用extend而不是['a', '1', 'b', '1', 'c1', 'c2']

我是否必须首先检查我附加的是否是一个列表,然后以元素方式附加它?或者有更好的功能已经做到了吗?

2 个答案:

答案 0 :(得分:3)

是的,您需要明确检查每个项目类型。

例如,你可以写:

a_

你得到:

# sample jsons
jsons = [{'foo': 'a1'},
         {'foo': 'b1'},
         {'foo': ['c1', 'c2']}]

my_list = []
for json in jsons:
    item = json['foo']
    if isinstance(item, list):
        my_list.extend(item)
    else:
        my_list.append(item)

但是,使用Python,您可以使用ternary conditional expression来简化:

['a1', 'b1', 'c1', 'c2']

答案 1 :(得分:2)

您可以使用singledispatch装饰器将部分样板移出主循环。装饰器可以从Python 3.4中的标准库中的functools模块获得,也可以通过PyPi上的singledispatch模块获得。

这定义了一个函数adder,它的行为会有所不同,具体取决于它(第一个)参数的类型。

@singledispatch
def adder(item):
    mylist.append(item)

@adder.register(list)
def _(item):
    mylist.extend(item)

mylist = []
for json in jsons:
    adder(json['foo'])