29

listPythonにのがあり、strings特別な方法に基づいてサブリストを作成したい場合は、stringどうすればよいですか?

例えば:

l = ["data","more data","","data 2","more data 2","danger","","date3","lll"]
p = split_special(l,"")

生成されます:

p = [["data","more data"],["data 2","more data 2","danger"],["date3","lll"]]
4

6 に答える 6

35

itertools.groupbyは 1 つのアプローチです (よくあることですが):

>>> l = ["data","more data","","data 2","more data 2","danger","","date3","lll"]
>>> from itertools import groupby
>>> groupby(l, lambda x: x == "")
<itertools.groupby object at 0x9ce06bc>
>>> [list(group) for k, group in groupby(l, lambda x: x == "") if not k]
[['data', 'more data'], ['data 2', 'more data 2', 'danger'], ['date3', 'lll']]

この特定のケースのために、少しごまかすことさえできます。

>>> [list(group) for k, group in groupby(l, bool) if k]
[['data', 'more data'], ['data 2', 'more data 2', 'danger'], ['date3', 'lll']]
于 2013-01-25T20:11:21.497 に答える
5

itertoolsを使用した1つの可能な実装

>>> l
['data', 'more data', '', 'data 2', 'more data 2', 'danger', '', 'date3', 'lll']
>>> it_l = iter(l)
>>> from itertools import takewhile, dropwhile
>>> [[e] + list(takewhile(lambda e: e != "", it_l)) for e in it_l if e != ""]
[['data', 'more data'], ['data 2', 'more data 2', 'danger'], ['date3', 'lll']]

*

これは、groupbyを使用するのと同じくらい高速です

>>> stmt_dsm = """
[list(group) for k, group in groupby(l, lambda x: x == "") if not k]
"""
>>> stmt_ab = """
it_l = iter(l)
[[e] + list(takewhile(lambda e: e != "", it_l)) for e in it_l if e != ""]
"""
>>> t_ab = timeit.Timer(stmt = stmt_ab, setup = "from __main__ import l, dropwhile, takewhile")
>>> t_dsm = timeit.Timer(stmt = stmt_dsm, setup = "from __main__ import l, groupby")
>>> t_ab.timeit(100000)
1.6863486541265047
>>> t_dsm.timeit(100000)
1.5298066765462863
>>> t_ab.timeit(100000)
1.735611326163962
>>> 
于 2013-01-25T20:35:46.753 に答える
2

reduce頭に浮かぶ:

def split(iterable, where):
    def splitter(acc, item, where=where):
        if item == where:
            acc.append([])
        else:
            acc[-1].append(item)
        return acc
    return reduce(splitter, iterable, [[]])


data = ["data","more data","","data 2","more data 2","danger","","date3","lll"]
print split(data, '')

結果:

[['data', 'more data'], ['data 2', 'more data 2', 'danger'], ['date3', 'lll']]
于 2013-01-25T20:35:53.607 に答える
1

これがそれを解決する最も「pythonic」な方法であるかどうかはわかりません。

def split_seq(seq, sep):
    start = 0
    while start < len(seq):
        try:
           stop = start + seq[start:].index(sep)
           yield seq[start:stop]
           start = stop + 1
        except ValueError:
           yield seq[start:]
           break

ll = ["data","more data","","data 2","more data 2","danger","","date3","lll"]
p = [i for i in split_seq(ll,"")]
于 2013-01-25T20:05:19.700 に答える
0

ここに1つのアイデアがあります。:)

def spec_split(seq,sep):
    # Ideally this separator will never be in your list
    odd_sep = "!@#$%^&*()"

    # Join all the items with the odd separator and split
    # anywhere the odd separator + separator + odd seperator meet
    # This makes a list of items broken by the separator
    jumble = odd_sep.join(seq).split(odd_sep+sep+odd_sep)

    # split the remaining items broken by odd separators into sublists
    return [item.split(odd_sep) for item in jumble] 
于 2013-01-25T20:48:51.567 に答える