向lis追加N>=1个元素

2024-04-26 05:18:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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']。你知道吗

我是否必须首先检查我附加的是一个列表,然后按元素附加它?还是有更好的功能已经做到了这一点?你知道吗


Tags: injson元素列表forfoomya1
2条回答

您可以使用singledispatch装饰器将一些样板文件移出主循环。修饰符可以从python3.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'])

是的,您需要显式检查每个项类型。你知道吗

例如,您可以编写:

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

相关问题 更多 >