2016-09-16 5 views
0

私は、アルファベットと数字の両方の要素で構成されたリストをPythonで持っています。例えば、list = ["a", 1, 2, 3, "b", 4, 5, 6]のように2つのリストにスライスして、 so list1 = [1, 2, 3]list2 = [4, 5, 6]です。 abの要素は逆順になる可能性がありますが、一般的には、abの要素を別々のリストに格納します。私は条件とループを作成していた思い付いた最も簡単な解決策:Pythonでリストの一部のみを反復する

#Generating a list for numeric elements following "a": 
    for e in list[list.index("a")+1:]: 
     if not str.isdigit(e): 
     break 
     else: 
     list1.append(e) 

私は"b"list2と数値要素についても同様にそれを行うだろう。 もっと洗練されたソリューションはありますか?私はPythonを初めて使っていますが、私は美しい一ライナー構造を見ました。私の場合はそういうことがありますか?前もって感謝します。

+0

あなたは完全なコード例を与えることによって、たとえば、もう少し質問を明確にすることはできますか? – linusg

+0

今より良い:Dしかし、タイトルはまだ混乱していると思う...あなたはリストを繰り返し、特定の要素または何かをスキップしたいですか? – linusg

答えて

4

このような何か?それは入力データがあることを期待迅速かつ汚いバージョンであることを

>>> import itertools 
>>> import numbers 
>>> lst = ["a", 1, 2, 3, "b", 4, 5, 6] 
>>> groups = itertools.groupby(lst, key=lambda x: isinstance(x, numbers.Number)) 
>>> group_key = None 
>>> result = [] 
>>> for is_number, group_iter in groups: 
...  if not is_number: 
...   for x in group_iter: 
...    group_key = x 
...  else: 
...   result.append((group_key, [x for x in group_iter])) 
>>> result 
[('a', [1, 2, 3]), ('b', [4, 5, 6])] 

注よく:

>>> import itertools 
>>> import numbers 
>>> lst = ["a", 1, 2, 3, "b", 4, 5, 6] 
>>> groups = itertools.groupby(lst, key=lambda x: isinstance(x, numbers.Number)) 
>>> result = [[x for x in group_iter] for is_number, group_iter in groups if is_number] 
>>> result 
[[1, 2, 3], [4, 5, 6]] 

そして、ここでは(group_key, group_numbers)タプルのペアのリストを出力しない「セクシー」バージョンです。形成された。

あなたがスライスを使用することができます
+0

このソリューションのように、私はそれを自分で考えていたが、共有できなかった – Netwave

3

ここでは、機能的aproach持っている:

[x for (x, y) in enumerate(l) if type(y) is str] + [len(l)] 
:私たちが持つ文字のインデックス、我々はそれの終わりを知るために、リストのサイズを必要とする通知を取得

>>> l = ["a", 1, 2, 3, "b", 4, 5, 6] 
>>> dig = [x for (x, y) in enumerate(l) if type(y) is str] + [len(l)] 
>>> dig 
[0, 4, 8] 
>>> slices = zip(map(lambda x:x+1, dig), dig[1:]) 
>>> slices 
[(1, 4), (5, 8)] 
>>> lists = map(lambda (i, e): l[i:e], slices) 
>>> lists 
[[1, 2, 3], [4, 5, 6]] 

ファーストを

zip(map(lambda x:x+1, dig), dig[1:]) 

最後に、我々はorigiから各スライスを取得:

はその後、我々はリストであるスライスのペアを取得しますすべてのリスト:

map(lambda (i, e): l[i:e], slices) 
0

list = ["a", 1, 2, 3, "b", 4, 5, 6] 
lista = list[list.index('a')+1:list.index('b')] 
listb = list[list.index('b')+1:] 
0

別のアプローチ(のみPythonの3):

def chunks(values, idx=0): 
    ''' Yield successive integer values delimited by a character. ''' 

    tmp = [] 
    for idx, val in enumerate(values[1:], idx): 
     if not isinstance(val, int): 
      yield from chunks(values[idx + 1:], idx) 
      break 
     tmp.append(val) 
    yield tmp 


>>> values = ['a', 1, 2, 3, 'b', 4, 5, 6] 
>>> list(chunks(values)) 
[[4, 5, 6], [1, 2, 3]] 
関連する問題