扩展列表中的元素

时间:2010-02-02 16:42:25

标签: 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

非常难看。我可以使用以下内容将内容重写为新列表:

nl = []
for x in l:
   if needs_expanding(x):
      nl += expand(x)
   else:
      nl.append(x)

但他们似乎都太长了。或者我可以简单地做2次通过并稍后压平列表:

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)

但这也感觉不对。

还有其他明确的方法吗?

3 个答案:

答案 0 :(得分:3)

你的最后两个答案就是我要做的。我不熟悉flatten()但是如果你有这样的功能那么看起来很理想。您还可以使用内置的sum()

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, [])

答案 1 :(得分:2)

最后一个可能是你最pythonic,但你可以尝试一个隐含的循环(或在py3,生成器)与地图:

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

答案 2 :(得分:2)

如果您不需要在生成的列表中进行随机访问,也可以使用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作为变量名称,因为它几乎与数字1无法区分。