在列表推导中一次添加两个项目

时间:2013-10-19 12:46:08

标签: 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']

我正在尝试在每个小写字母之前创建一个前缀为^的字符列表。在此示例中,您需要使用sum来展平列表。但是,我的问题是,如果有可能首先制作一个平面清单。上面的输出是所需的输出。

同样地,在随for循环的每次迭代而变化的变量之前,不断添加 。这里不能使用两个for循环,因为这太简单了,例如:

mystring = 'ABCELKJSDLHFWEHSJDHFKHIUEHFSDF'
print [item for x in mystring.lower() for item in ['^', x]]

如果有人这样做:

>>> 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']

您可以在列表中获得列表。因此,有没有一种方法可以在列表推导中一次追加两个项目,而不必使用添加for循环或sum之类的附加函数?我问这个,因为它很简单,但我找不到办法。如果有人试图执行以下操作:

>>> ['^', x for x in mystring.lower()]
  File "<console>", line 1
    ['^', x for x in mystring.lower()]
              ^
SyntaxError: invalid syntax

尝试提供SyntaxError。那么,我在Python中无法做到的事情是什么?使用()为我提供了一个元组列表。

我还使用splat / unpacking运算符尝试

>>> [*['^', x] for x in mystring.lower()]
  File "<console>", line 1
    [*['^', x] for x in mystring.lower()]
     ^
SyntaxError: invalid syntax

但如上所述,这也是语法错误。很抱歉这个晚期编辑,但我已经尝试了以下内容:

import itertools
mystring = "HELLOWORLD"
print(list(itertools.chain.from_iterable(('^', x) for x in mystring.lower())))

但上述内容仍需要导入。

4 个答案:

答案 0 :(得分:7)

你可以从这开始:

print list( '^'.join(mystring.lower()) )

给出:

['a', '^', 'b', '^', 'c', '^', ...]

所以这会产生所需的输出:

l = list( '^'.join(mystring.lower()) )
l.insert(0, '^')
print l

另一种方式:

print [ y for x in zip(['^'] * len(mystring), mystring.lower()) for y in x ]

给出:

['^', 'a', '^', 'b', '^', 'c', ...

答案 1 :(得分:4)

您可以使用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']

答案 2 :(得分:0)

如果有人在使用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']

答案 3 :(得分:0)

好吧,在这种特定情况下...

>>> list('abcd'.replace('', '^')[ : -1])
['^', 'a', '^', 'b', '^', 'c', '^', 'd']
>>>