21

リスト内包表記に一度に 2 つの項目を追加したいと考えています。1項目は一定です。リスト内包表記内の for ループを 1 つだけ使用し、追加の関数を使用せずにこれを実現するにはどうすればよいでしょうか。インポートを使用しない回答が優先されます。

以下をご覧ください。

>>> 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この例では、リストを平坦化するために を使用する必要があります。しかし、私の質問は、そもそもフラットなリストを作成できるかどうかです。上記の出力は、目的の出力です。

のように、ループの反復ごとに変化する変数の前に何かを常に追加します。ここでは単純すぎるため、for2 つのループを使用することはできません。たとえば、次のようになります。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']

リスト内のリストを取得します。したがって、ループの追加や追加の関数を使用せずに、リスト内包表記で一度に 2 つの項目を追加できる方法はありますsumか? これは非常に単純なことですが、それを行う方法が見つからないので、私はこれを尋ねます。次のことをしようとすると:

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

試行はSyntaxError. では、私が求めていることは Python では不可能ですか? を使用()すると、タプルのリストが表示されます。

/演算子も使用してみました:splatunpacking

>>> [*['^', 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

4 に答える 4

10

を使用できます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']

yield fromPython 3.3+では、ジェネレーター関数でも使用できます。

>>> 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']
于 2013-10-19T12:52:54.260 に答える
8

これで始めることができます:

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', ...
于 2013-10-19T12:54:20.060 に答える