Gam*_*iac 12 python list-comprehension
我想一次添加两个项目到列表理解.一个项目是不变的.如何在列表理解中仅使用一个for循环来实现这一点,而不需要额外的功能.不使用任何导入的答案将受到青睐.
看看以下内容:
>>> mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF'
>>> sum([['^', char] for char in mystring.lower()], [])
['^', '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']
Run Code Online (Sandbox Code Playgroud)
我试图用^小写前面的每个字母前面的字符制作一个列表.在此示例中,您需要使用sum以展平列表.但是,我的问题是,如果有可能首先制作一个平面清单.上面的输出是所需的输出.
就像在,在变量随着循环的每次迭代而变化之前不断附加某些东西for.for这里不能使用两个循环,因为这太简单了,例如:
mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF'
print [item for x in mystring.lower() for item in ['^', x]]
Run Code Online (Sandbox Code Playgroud)
如果有人这样做:
>>> mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF'
>>> [['^', 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']
Run Code Online (Sandbox Code Playgroud)
您可以在列表中获得列表.因此,有没有一种方法可以在列表推导中一次追加两个项目,而不必使用添加for循环或其他函数,如sum?我问这个,因为它很简单,但我找不到办法.如果尝试执行以下操作:
>>> ['^', x for x in mystring.lower()]
File "<console>", line 1
['^', x for x in mystring.lower()]
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
这次尝试给了一个SyntaxError.那么,我在Python中无法做到的事情是什么?使用()给我一个元组列表.
我也尝试过使用splat/ unpacking运算符:
>>> [*['^', x] for x in mystring.lower()]
File "<console>", line 1
[*['^', x] for x in mystring.lower()]
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
但如上所述,这也是语法错误.很抱歉这么晚的编辑,但我已经试过如下:
import itertools
mystring = "HELLOWORLD"
print(list(itertools.chain.from_iterable(('^', x) for x in mystring.lower())))
Run Code Online (Sandbox Code Playgroud)
但上述仍然需要进口.
你可以从这开始:
print list( '^'.join(mystring.lower()) )
Run Code Online (Sandbox Code Playgroud)
这使:
['a', '^', 'b', '^', 'c', '^', ...]
Run Code Online (Sandbox Code Playgroud)
所以这会给出所需的输出:
l = list( '^'.join(mystring.lower()) )
l.insert(0, '^')
print l
Run Code Online (Sandbox Code Playgroud)
另一种方式:
print [ y for x in zip(['^'] * len(mystring), mystring.lower()) for y in x ]
Run Code Online (Sandbox Code Playgroud)
这使:
['^', 'a', '^', 'b', '^', 'c', ...
Run Code Online (Sandbox Code Playgroud)
您可以使用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']
Run Code Online (Sandbox Code Playgroud)
在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']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6203 次 |
| 最近记录: |