例如,从下面的'tokens'列表中,我想提取pair_list:
tokens = ['0', '#', 'a', 'b', '#', '#', 'c', '#', '#', 'g', 'h', 'g', '#']
pair_list = [['a', 'b'], ['c'], ['g', 'h', 'g']]
我试着做下面的事情,但是没有成功:
hashToken_begin_found = True
hashToken_end_found = False
previous_token = None
pair_list = []
for token in tokens:
if hashToken_begin_found and not hashToken_end_found and previous_token and previous_token == '#':
hashToken_begin_found = False
elif not hashToken_begin_found:
if token == '#':
hashToken_begin_found = True
hashToken_end_found = True
else:
...
添加:
我的实际问题更复杂。这对#符号里面的是社交媒体上的单词,就像推特上的散列短语一样,但它们不是英语。我简化了这个问题来说明这个问题。逻辑就像我写的那样:找到每个#对的"开始"one_answers"结束"并提取它。在我的数据中,一对散列标签中的任何内容都是一个短语,即我住在#美国#和#纽约#!我要把美国和纽约联系起来。不正则表达式。这些词已经在列表中了。
我认为你把问题复杂化了。可以把解析器看作一个非常简单的状态机。你要么在子列表中,要么不在。每次你碰到一个散列,你就切换状态。
当输入子列表时,创建一个新列表。当在子列表中时,追加到当前列表。差不多就是这样。下面是一个示例:
pair_list = []
in_pair = False
for token in tokens:
if in_pair:
if token == '#':
in_pair = False
else:
pair_list[-1].append(token)
elif token == '#':
pair_list.append([])
in_pair = True
您可以尝试在一行中使用itertools.groupby
:
from itertools import groupby
tokens = ['0', '#', 'a', 'b', '#', '#', 'c', '#', '#', 'g', 'h', 'g', '#']
print([list(y) for x, y in itertools.groupby(tokens, key=lambda x: x.isalpha()) if x])
输出:
[['a', 'b'], ['c'], ['g', 'h', 'g']]
按按字母顺序排列的连续分组进行分组。
如果您想使用for
循环,您可以尝试:
l = [[]]
for i in tokens:
if i.isalpha():
l[-1].append(i)
else:
if l[-1]:
l.append([])
print(l[:-1])
输出:
[['a', 'b'], ['c'], ['g', 'h', 'g']]
另一种方式(尝试在线!):
it = iter(tokens)
pair_list = []
while '#' in it:
pair_list.append(list(iter(it.__next__, '#')))
又一个(在线试试!):
pair_list = []
try:
i = 0
while True:
i = tokens.index('#', i)
j = tokens.index('#', i + 1)
pair_list.append(tokens[i+1 : j])
i = j + 1
except ValueError:
pass