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