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

Append N >= 1 elements to a list

我正在 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']

我是否必须先检查我追加的是否是列表,然后逐个元素追加?或者是否有更好的功能已经做到了这一点?

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

例如,你可以这样写:

# 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)

你得到:

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

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

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

您可以使用 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'])