【问题标题】:Expanding elements in a list展开列表中的元素
【发布时间】:2010-02-02 16:42:25
【问题描述】:

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

标准的迭代方式是:

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)

但这也不“正确”。

还有其他明确的方法吗?

【问题讨论】:

  • 我觉得第二版已经够清晰了。
  • @KennyTM:我通常会使用最后一个。只是想看看人们还能想出什么/会在现实生活中使用/看到代码。

标签: python list


【解决方案1】:

你的最后两个答案是我会做的。虽然我不熟悉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, [])

【讨论】:

  • 好吧 - 总和很酷 - 没想到那个。 Flatten 只是一些用于展平列表的自定义函数 - 不是在 python 中(不幸的是)。
【解决方案2】:

如果您不需要在生成的列表中进行随机访问,您也可以使用编写生成器。

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 作为变量名,因为它与数字一几乎没有区别。

【讨论】:

  • 重新。小写-L - pylint 一直在提醒我 ;) 我只是在一个简单的例子中使用它来节省打字......
【解决方案3】:

最后一个可能是你最喜欢 Python 的,但你可以尝试使用 map 的隐含循环(或在 py3 中,生成器):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2020-05-21
    • 2023-03-17
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2020-10-28
    相关资源
    最近更新 更多