と__contains__
s = "dylankid: *random words d* senpai: *random words s* dylankid: *random words d* senpai: *random words s*"
from itertools import groupby
d = {"dylankid:": [], "senpai:":[]}
grps = groupby(s.split(" "), d.__contains__)
for k, v in grps:
if k:
d[next(v)].append(" ".join(next(grps)[1]))
print(d)
を使用してグループ化出力:
{'dylankid:': ['*random words d*', '*random words d*'], 'senpai:': ['*random words s*', '*random words s*']}
たびに、私たち入手する 私たちの辞書の名前はnext(v)
でその名前を使用し、str.join
を使用して次の名前までのグループの次のグループを取得し、1つの文字列に戻って結合します。大きな文字列の
s = "dylankid: *random words d* senpai: *random words s* dylankid: *random words d* senpai: *random words s* senpai:"
from itertools import groupby
d = {"dylankid:": [], "senpai:":[]}
grps = groupby(s.split(" "), d.__contains__)
for k, v in grps:
if k:
d[next(v)].append(" ".join(next(grps,[[], []])[1]))
print(d)
いくつかのタイミング:
In [15]: dy, sn = "dylankid:", " senpai:"
In [16]: t = " foo " * 1000
In [17]: s = "".join([dy + t + sn + t for _ in range(1000)])
In [18]: %%timeit
....: d = {"dylankid:": [], "senpai:": []}
....: grps = groupby(s.split(" "), d.__contains__)
....: for k, v in grps:
....: if k:
....: d[next(v)].append(" ".join(next(grps, [[], []])[1]))
....:
1 loop, best of 3: 376 ms per loop
In [19]: %%timeit
....: PATTERN = '''
....: \s* # Any amount of space
....: (dylankid|senpai) # Capture person
....: :\s # Colon and single space
....: (.*?) # Capture everything, non-greedy
....: (?=\sdylankid:|\ssenpai:|$) # Until we find following person or end of string
....: '''
....: res = defaultdict(list)
....: for person, message in re.findall(PATTERN, s, re.VERBOSE):
....: res[person].append(message)
....:
1 loop, best of 3: 753 ms per loop
両方を使用すると、名前の後に言葉を持たないために起こった場合
は、あなたが次の呼び出しのデフォルト値として空のリストを使用することができます
In [20]: d = {"dylankid:": [], "senpai:": []}
In [21]: grps = groupby(s.split(" "), d.__contains__)
In [22]: for k, v in grps:
if k:
d[next(v)].append(" ".join(next(grps, [[], []])[1]))
....:
In [23]: PATTERN = '''
....: \s* # Any amount of space
....: (dylankid|senpai) # Capture person
....: :\s # Colon and single space
....: (.*?) # Capture everything, non-greedy
....: (?=\sdylankid:|\ssenpai:|$) # Until we find following person or end of string
....: '''
In [24]: res = defaultdict(list)
In [25]: for person, message in re.findall(PATTERN, s, re.VERBOSE):
....: res[person].append(message)
....:
In [26]: d["dylankid:"] == res["dylankid"]
Out[26]: True
In [27]: d["senpai:"] == res["senpai"]
Out[27]: True
[.partition](https://docs.python.org/2/library/stdtypes.html#str.part)があります。 ition)は、指定した区切り文字の後で文字列を分割できるので便利です。 –
ランダムな単語に ':'が付いていますか? –
@PadraicCunninghamはいあります。 –