我在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']
。
我是否必须首先检查我附加的是否是一个列表,然后以元素方式附加它?或者有更好的功能已经做到了吗?
答案 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'])