Добавление двух элементов одновременно в понимании списка

Я хочу добавить два элемента одновременно к пониманию списка. Один элемент является постоянным. Как это можно достичь, используя только один цикл внутри понимания списка и никаких дополнительных функций. Ответы, которые не используют импорт, будут одобрены.

Взгляните на следующее:

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

Вы получаете списки в списках. Таким образом, существует ли способ, по которому вы можете добавить два элемента одновременно в понимании списка, не используя дополнение для цикла или дополнительную функцию типа 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())))

Но выше все еще требуется импорт.

Ответ 1

Вы можете начать с этого:

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', ...

Ответ 2

Вы можете использовать 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']

Ответ 3

Если кто-то использует 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']