在列表推导式中一次添加两个项目
在列表推导式中一次添加两个项目
我想要一次向列表推导式中添加两个项目。其中一个项目是固定的。如何在只使用一个for循环和没有额外函数的情况下实现这个目标?不使用任何导入的答案将受到青睐。\n看一下以下内容:\n
mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF' print(sum([['^', char] for char in mystring.lower()], []))
\n我试图创建一个列表,其中在每个小写字母之前都添加字符“^”。在这个示例中,你需要使用`sum`函数来平铺列表。然而,我的问题是,是否可能一开始就创建一个平铺的列表。上面的输出是期望的输出。\n也就是说,在每次`for`循环迭代时,在一个可变的变量之前不断添加某个固定的东西。这里不能使用两个`for`循环,因为那样太简单了,例如:\n
mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF' print([item for x in mystring.lower() for item in ['^', x]])
\n如果像这样做:\n
mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF' print([['^', x] for x in mystring])
\n你会得到嵌套的列表。那么,有没有办法在列表推导式中一次添加两个项目,而不需要使用额外的for循环或像`sum`这样的附加函数呢?我问这个问题,因为这是一件相当简单的事情,但我找不到方法来实现它。如果尝试以下操作:\n
['^', x for x in mystring.lower()]
\n你会得到一个`SyntaxError`。那么,我在Python中所问的事情是不可能做到的吗?使用`()`会给我一个元组的列表。\n我还尝试过使用“splat”/“unpacking”运算符:\n
[*['^', x] for x in mystring.lower()]
\n但和上面一样,这也是一个语法错误。很抱歉这个迟到的编辑,但我已经尝试了以下方法:\n
import itertools mystring = "HELLOWORLD" print(list(itertools.chain.from_iterable(('^', x) for x in mystring.lower())))
\n但上面的方法仍然需要一个导入。
问题的出现原因是,需要将一个嵌套的列表展开为一个一维列表,以便可以在列表生成式中同时处理多个列表。
解决方法是使用pydash库中的flatten_deep函数,该函数递归地将列表展开到一级,从而可以在列表生成式中处理多个列表。
具体代码如下:
import pydash mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF' pydash.flatten_deep([['^', x] for x in mystring])
运行结果为:
['^', 'A', '^', 'B', '^', 'C', '^', 'E', '^', 'L', '^', 'K', '^', 'J', '^', 'S', '^', 'D', '^', 'L', '^', 'H', '^', 'F', '^', 'W', '^', 'E', '^', 'H', '^', 'S', '^', 'J', '^', 'D', '^', 'H', '^', 'F', '^', 'K', '^', 'H', '^', 'I', '^', 'U', '^', 'E', '^', 'H', '^', 'F', '^', 'S', '^', 'D', '^', 'F']
通过使用pydash库中的flatten_deep函数,我们成功地将嵌套的列表展开为了一个一维列表,从而实现了在列表生成式中同时处理多个列表的目的。
问题的出现原因是在列表推导式中,无法一次添加两个元素。解决方法是使用insert()函数将'^'添加到列表的开头。
首先,给出了一个例子,使用join()函数将字符串转换为列表,并在每个字符之间添加'^'。然后将此列表转换为字符串并打印出来。但是,这个方法无法将'^'添加到列表的开头。
为了解决这个问题,使用了insert()函数将'^'添加到列表的开头,并将修改后的列表打印出来。
另一种方法是使用zip()函数和列表推导式,在每个字符之前添加'^'。这种方法可以将'^'添加到列表的开头,但是代码比较复杂。
为了简化代码,引入了纯列表推导式的解决方案。使用两个for循环,将'^'和每个字符依次添加到列表中。这种方法更加清晰简洁。
最后,如果要将'^'添加到列表的开头,可以使用list()函数和join()函数的组合,或者直接使用列表推导式。这两种方法都可以实现相同的效果。
添加两个项目时出现这个问题的原因是,使用列表推导式无法直接实现这个功能。虽然可以使用嵌套的列表推导式来实现,但对于大型列表来说效率较低。所以需要找到一种更高效的方法来解决这个问题。
解决方法之一是使用itertools.chain.from_iterable
函数,这相当于嵌套列表推导式的版本,但效率稍高。这个函数可以将嵌套的列表转化为一个迭代器,并将其中的元素展开成一个单层的列表。具体实现方法如下:
>>> from itertools import chain >>> mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF' >>> list(chain.from_iterable([['^', x] for x in mystring])) ['^', 'A', '^', 'B', '^', 'C', '^', 'E', '^', 'L', '^', 'K', '^', 'J', '^', 'S', '^', 'D', '^', 'L', '^', 'H', '^', 'F', '^', 'W', '^', 'E', '^', 'H', '^', 'S', '^', 'J', '^', 'D', '^', 'H', '^', 'F', '^', 'K', '^', 'H', '^', 'I', '^', 'U', '^', 'E', '^', 'H', '^', 'F', '^', 'S', '^', 'D', '^', 'F']
在Python 3.3及以上的版本中,还可以使用yield from
在生成器函数中实现。具体实现方法如下:
>>> mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF' >>> def solve(strs): ... for x in strs: ... yield from ['^', x] ... >>> list(solve(mystring)) ['^', 'A', '^', 'B', '^', 'C', '^', 'E', '^', 'L', '^', 'K', '^', 'J', '^', 'S', '^', 'D', '^', 'L', '^', 'H', '^', 'F', '^', 'W', '^', 'E', '^', 'H', '^', 'S', '^', 'J', '^', 'D', '^', 'H', '^', 'F', '^', 'K', '^', 'H', '^', 'I', '^', 'U', '^', 'E', '^', 'H', '^', 'F', '^', 'S', '^', 'D', '^', 'F']
虽然使用itertools
是一种解决方法,但问题的提问者想要知道是否有其他方法可以在列表推导式中每次添加一个常量。但是没有找到其他解决方法,因为sum()
函数效率较低且不推荐使用,而itertools.chain
函数在处理大型列表时效果更好。
总之,虽然使用itertools
或嵌套的循环是解决这个问题的常见方法,但在不使用任何导入或嵌套循环的情况下无法实现。