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