2011-11-30 16 views
6

文字列を分割して、いくつかの単語をPythonのタプルに割り当てることができます。 例:Pythonの1つの文で文字列を分割して割り当てることはできますか?

a = "Jack and Jill went up the hill" 
    (user1 , user2) = a.split().pick(1,3) #picks 1 and 3 element in the list. 

このような1つのライナーは可能ですか?もしそうなら、構文は何ですか?

+0

分割後に 'a'変数を保持する必要があることを意味しますか? – BoltClock

+1

ええと、誰もが1と3の代わりに0と2の要素の解を与えているようです。ちょっと面白い見解:) –

+0

私は変数を保持するつもりはありません。 – sheki

答えて

13

、あなたはoperator.itemgetterを使用することができます。

戻りオペランドの__getitem__()メソッドを使用して、そのオペランドからアイテムを取得する呼び出し可能なオブジェクトを。複数の項目が指定されている場合は、ルックアップ値のタプルを返します。

例:

>>> from operator import itemgetter 
>>> pick = itemgetter(0, 2) 
>>> pick("Jack and Jill went up the hill".split()) 
('Jack', 'Jill') 

または1ライナー(W/Oインポート)として:

>>> user1, user2 = itemgetter(0, 2)("Jack and Jill went up the hill".split()) 
+0

ニース(私にも知らなかったことを教えてくれた)!それでも、インポートステートメントでは、1つのライナーではない...しかし、2つ! ;) – mac

1

私の心に来る最初は、次のとおりです。場合

>>> a = "Jack and Jill went up the hill" 
>>> [e for n, e in enumerate(a.split()) if n in (0, 2)] 
['Jack', 'Jill'] 

あなたは疑問に思う:enumerateは、第1の要素と第2のなどの列挙反復可能の要素としてプログレッシブ数でタプルを生成します。

EDIT:としては@kindallのコメントで述べて、最後のステップは次のようになります。

>>> user1, user2 = [e for n, e in enumerate(a.split()) if n in (0, 2)] 
>>> user1 
'Jack' 
>>> user2 
'Jill' 

んだけど、あれば申し訳ありません(それ以上の点に例を保つために割り当てを行うにはないことを選びましたこの混乱した誰か)。

+0

それはリストの理解です。彼はタプルを望んでいる。 (これは単純なキャストで扱うことができると思われます...) – BoltClock

+2

質問者のためのドットを接続するには: 'user1、user2 =(nの場合はe、nはe、列挙する場合はa.split() 0、2)) '(いいえ、タプルを要求しませんでした。複数の割り当ては、シーケンスやジェネレータ式でも動作します) – kindall

6

あなたは_は、我々は価値が気にしない、とsplit(" ", 3)は4つのセグメントで文字列を分割することを意味し、この

a = "Jack and Jill went up the hill" 
user1, _, user2, _ = a.split(" ", 3) 

ような何かを行うことができます。

+1

Ingenius ... 1024番目の要素だけをあなたのリスト! ;) – mac

2

私はむしろ二行でこれを行うが、ここでワンライナーだと思います:

user1, user2 = [token for (i, token) in enumerate(a.split()) if i in (0, 2)]

ここではニーズがあることを場合、私はちょうど読みやすさとバグの導入少ないチャンスのために(代わりにどうなるのかです将来変わる)。あなたは空想を取得したい場合は

tokens = a.split() 
user1 = tokens[0] 
user2 = tokens[2] 
+0

それは基本的に私の答えです...私のポストの2分後。 :( – mac

+0

なぜぼろぼろですか?あなたはレースに勝った:) –

2

スライスがステップパラメータ

a = "Jack and Jill went up the hill" 
(user1 , user2) = a.split()[0:4:2] #picks 1 and 3 element in the list 

しかし一方をサポートPythonでファンキーなonelinerを書くことが可能です運動の種類で。

+0

これは、選択する要素が一定の間隔である場合にのみ有効です。 – mac

+3

2つのエンクレージャーがすべて必要な場合、それらは「定期的な間隔」になります:-) – jsbueno

1

このトリックん

user1, user2 = a.split()[0::2][:2]

は2で2から数え配列の最初の2つの要素をピック。

関連する問題