Python 展开列表中的元素

Python 展开列表中的元素,python,list,Python,List,我正在寻找一种“好”的方法来处理一个列表,其中一些元素需要扩展成更多的元素(仅一次,不扩展结果) 标准的迭代方法是: i=0 while i < len(l): if needs_expanding(l[i]): new_is = expand(l[i]) l[i:i] = new_is i += len(new_is) else: i += 1 但它们似乎都太长了。或者我可以简单地做两次传球,然后将列表展平: flatten(

我正在寻找一种“好”的方法来处理一个列表,其中一些元素需要扩展成更多的元素(仅一次,不扩展结果)

标准的迭代方法是:

i=0
while i < len(l):
   if needs_expanding(l[i]):
      new_is = expand(l[i])
      l[i:i] = new_is
      i += len(new_is)
   else:
      i += 1
但它们似乎都太长了。或者我可以简单地做两次传球,然后将列表展平:

flatten(expand(x) if needs_expanding(x) else x for x in l)
# or
def try_expanding(x)....
flatten(try_expanding(x) for x in l)
但这也感觉不“对”


有没有其他明确的方法可以做到这一点?

最后一种方法可能是您最喜欢的Python方法,但您可以尝试使用map进行隐含循环(或者在py3中,使用生成器):

flatten(map(lambda x: expand(x) if needs_expanding(x) else x, l))
flatten(map(try_expanding, l))

你的最后两个答案就是我要做的。虽然我不熟悉
flatte()
,但是如果您有这样一个函数,那么它看起来很理想。您还可以使用内置的
sum()


如果在生成的列表中不需要随机访问,也可以使用write a generator

def iter_new_list(old_list):    
    for x in old_list:
       if needs_expanding(x):
           for y in expand(x):
               yield y
       else:
           yield x

new_list = list(iter_new_list(old_list))
这在功能上与第二个示例相当,但在实际情况下可能更具可读性


此外,Python编码标准禁止使用小写-L作为变量名,因为它与数字名称几乎没有区别。

我认为第二个版本足够清楚。@KennyTM:我通常使用最后一个版本。我只是想看看人们在现实生活中还能想出什么/会很舒服地使用/看到什么。好吧,sum很酷-我没想到这个。Flatte只是一个用于展平列表的自定义函数,而不是python中的函数(不幸的是).re。小写-L-派林不断提醒我;)我只在一个简单的例子中使用它来保存键入。。。
sum(expand(x) if needs_expanding(x) else [x] for x in l, [])
sum(needs_expanding(x) and expand(x) or [x] for x in l, [])
def iter_new_list(old_list):    
    for x in old_list:
       if needs_expanding(x):
           for y in expand(x):
               yield y
       else:
           yield x

new_list = list(iter_new_list(old_list))