如何在python中生成列表并同时将其展平?

如何在python中生成列表并同时将其展平?,python,Python,这更像是一个重构问题,因为代码按原样工作。但是,由于我还在学习Python,我认为有更好的方法可以做到这一点,现在我花了几个小时研究其他的可能性,但却一事无成 因此,我有以下声明: numbers=[票证中票证的重新拆分('?-?',ticket.text.strip()) 这显然会生成一个列表列表。然而,我只想从正则表达式中取出一个数字列表 这是第二行代码,它将上面的列表展平(我在这里找到了这个解决方案,在StackOverflowbtw): flat=[集合列表中项目的集合列表编号] 我试图

这更像是一个重构问题,因为代码按原样工作。但是,由于我还在学习Python,我认为有更好的方法可以做到这一点,现在我花了几个小时研究其他的可能性,但却一事无成

因此,我有以下声明:

numbers=[票证中票证的重新拆分('?-?',ticket.text.strip())

这显然会生成一个列表列表。然而,我只想从正则表达式中取出一个数字列表

这是第二行代码,它将上面的列表展平(我在这里找到了这个解决方案,在
StackOverflow
btw):

flat=[集合列表中项目的集合列表编号]

我试图实现的主要目标是在一行上实现这一点。否则,我当然可以为..创建一个正常的
。。在
循环中,这会将每个数字附加到数字列表中,但我喜欢将其保持在一行


如果这是最好的,我也很想知道,请:)

只需将第一个表达式替换为第二个表达式中的
数字

flat = [item for setlist in [re.split(' ?- ?', ticket.text.strip()) for ticket in tickets] for item in setlist]

您可以使用
chain
map
在单行中实现它,如下所示:

list(chain(*map(lambda x: re.split(' ?- ?', x.text.strip()), tickets)))
建议:

这里不需要使用
regex
,因为您可以使用Python的
split
函数实现同样的功能。因此,你的答案将是:

list(chain(*map(lambda x: x.text.replace(' ', '').split('-')), tickets)))
解释:

库中的
chain
函数用于包装列表。下面是示例

>>> from itertools import chain
>>> my_nested_list = [[1,2,3], [4,5,6]]
>>> list(chain(*my_nested_list))
[1, 2, 3, 4, 5, 6]
map
函数用于调用
列表
的每个项目上传递的
函数
(在本例中为
lambda
函数)

>>> my_nested_list = [[1,2,3], [4,5,6]]
>>> map(lambda x: x[0], my_nested_list)
[1, 4]
并且,
split
用于根据子字符串拆分字符串的内容。例如:

>>> x = 'hey you - i am here'
>>> x.split('-')
['hey you ', ' i am here']  # Same answer as your regex

更好的方法是在列表中的
re.split('?-?',ticket.text.strip())
上添加另一个循环:

flat = [x for ticket in tickets for x in re.split(' ?- ?', ticket.text.strip())]
flat = [item for ticket in tickets for item in re.split(' ?- ?', ticket.text.strip())]
它也更高效、更清洁

顺便说一下,您应该使用字符串方法而不是正则表达式:

flat = [x.strip() for ticket in tickets for x in ticket.split('-')]
如果需要将
x
转换为
int
,可以删除
strip()
,因为
int
忽略前导和尾随空格

flat = [int(x) for ticket in tickets for x in ticket.split('-')]

好吧,让我们一步一个脚印地完成这项工作。 作为一组部分嵌套的for循环,您的代码将是:

numbers = []
for ticket in tickets:
    numbers.append(re.split(' ?- ?', ticket.text.strip())
flat = []
for setlist in numbers:
    for item in setlist:
        flat.append(item)
通过它交谈: 你有一张票单。当您将正则表达式拆分应用于每个票证时,每个票证将成为一个集合列表。然后,您需要获取集合列表中的所有项,并将它们放在单个列表中。实际上,您不需要在任何时候拥有所有集合列表的列表(您称之为
数字
),这只是一个中间阶段

将其重构为完全嵌套:

flat = []
for ticket in tickets:
    for item in re.split(' ?- ?', ticket.text.strip()):
         flat.append(item)
现在我们已经有了一组完全嵌套的for循环,重构为列表或生成器是很简单的:

flat = [x for ticket in tickets for x in re.split(' ?- ?', ticket.text.strip())]
flat = [item for ticket in tickets for item in re.split(' ?- ?', ticket.text.strip())]
这是一条相当长的单行线,但它是一条单行线

顺便说一句,正则表达式可能不是解析那样的数字的最佳方法——特别是如果您想要实际的数字而不是字符串
re.split()
比str.split()慢,而且这种拆分非常简单,后者可以完成。如果数字是整数,请尝试:

flat = [int(item) for ticket in tickets for item in ticket.split('-'))]
如果它们是浮动的,请尝试:

flat = [float(item) for ticket in tickets for item in ticket.split('-'))]

这是因为
int(str)
float(str)
内置函数会自动忽略给定字符串开头和结尾的空格,因此不需要正则表达式有条件地匹配该空格。如果需要的话,生成的数字仍然可以插入字符串中,并且应该占用更少的内存空间。如果数字是整数,则不会丢失任何东西。如果它们是浮点数,则损失很小-您失去了数字的原始精度,如果您使用的是非常大或非常小的东西,您可能会遇到浮点数大小的限制(但这不太可能-请参见
sys.float\u info
了解这些限制是什么)。

这更像是一个重构问题,随着代码的运行-这种类型的问题可能会在代码视图上运行得更好:。他们接受人们的工作代码,并可以帮助您改进它。我建议把它移到那里。你为什么要用regex这样做呢?因为数字是这样的格式:1-2-3-4我已经添加了答案,如果你提到的逻辑起作用,它就会起作用(不过,不知道为什么会被否决)。如果你能提到你的门票内容,我可以核实一下,那就太好了it@Mr.goosberry:这个问题不适合代码审查。啊,我明白了!我是在没有内部方括号的情况下做的。当然,这是有道理的!非常感谢。这是非常低效的。啊,我知道,而且?再次阅读OP的要求<代码>我试图实现的主要目标是在一行上实现这一点是的,但这是一个糟糕的解决方案。@vaultah好吧,这个评论太宽泛了。当N很小时,这个解就足够好了。请注意,您不需要总是提供最有效的解决方案。请编辑更多信息。不鼓励只编写代码和“试试这个”答案,因为它们不包含可搜索的内容,也不解释为什么有人应该“试试这个”。更新了答案。请参见
建议
部分。我认为您不需要
regex
,因为与simple
split
相比,regex更重。我使用regex的原因也是为了去掉那些空格。在您的示例中,“hey you”和“i am here”都有空格。我想我必须修剪它们,所以总共有两个函数-拆分+修剪。但我们无论如何都在使用
strip
来修剪空白。所以,没关系。另外,我想提到的是,您也可以将
拆分为
.split('-')
-
:)之后的
空格
)我尝试过,但x.text返回html文本内容。因此,它有大量的空空间,比如选项卡