如何提取列表中包含的哈希符号对的列表?



例如,从下面的'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

最新更新