gpt4 book ai didi

python - 列表理解以创建列表

转载 作者:太空宇宙 更新时间:2023-11-04 00:12:35 24 4
gpt4 key购买 nike

能否使用列表推导式更紧凑地编写以下代码?

labels=[]
for i in range(10):
labels=labels+[i]+9*['']
labels=labels+[10]

最佳答案

这里有一种分解方法。

如果您查看循环的主体,您可以将其重组为为每个数字生成一个子列表,然后将子列表组合在一起。

sublists = []
for i in range(10):
sublists.append([i] + 9 * [''])

labels = []
for sublist in sublists:
labels = labels + sublist

labels = labels + [10]

这一部分的第一部分获取一个数字列表,对每个数字调用相同的函数,并生成一个结果列表。这个操作是map (并且确实在许多语言中都有这个名字)。第二部分获取一个列表列表并将它们扁平化为一个大列表;许多语言都有“concat”或“flatten”操作,但在 Python 中 it can be a little clunky .

from itertools import chain
sublists = map(range(10), lambda i: [i] + 9 * [''])
labels = list(chain.from_iterable(sublists))
labels = labels + [10]

map() 调用特别容易转换为列表理解(或生成器理解)

from itertools import chain
sublists = [[i] + 9 * [''] for i in range(10)]
labels = list(chain.from_iterable(sublists))
labels = labels + [10]

所以如果你想把它变成单行你可以有

from itertools import chain
labels = list(chain.from_iterable([i] + 9 * [''] for i in range(10))) + [10]

对于完全不同的事情,您可能会使用生成器函数来更清楚地了解您在做什么。实际上,对于输入中的每个项目,您都会发出该项目,如果它不是最后一项,则会发出九个包含空字符串的列表。然后,您可以获取生成器函数生成的序列并将其转换为列表。

def emit_with_blanks(iter):
l = list(iter)
for i, n in enumerate(l):
yield [i]
if i == len(l) - 1:
break
for _ in range(9):
yield ['']

labels = list(emit_with_blanks(range(10))

这肯定更长更慢(在实践中不重要的方式)但它可能比单行更容易推理它在做什么,特别是如果你在六个月后回来看它并且是试图记住代码的确切作用。

关于python - 列表理解以创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009943/

24 4 0
文章推荐: c - 打印三个内容相同的字符串会得到不同的结果
文章推荐: node.js - 如何运行谷歌助手比特币信息示例 webhook index.js
文章推荐: javascript - 如何使用 HTML