如何使用Python将来自不同元组但位于同一索引中的两个字符串连接起来?

如何使用Python将来自不同元组但位于同一索引中的两个字符串连接起来?,python,ipython,Python,Ipython,文件中的元组: ('Wanna', 'O') ('be', 'O') ('like', 'O') ('Alexander', 'B') ('Coughan', 'I') ('?', 'O') 我的问题是,如何将来自不同元组但在同一索引中具有条件的两个字符串连接起来 例如,在我的例子中,如果[1]等于'B'并后跟'i',我想在[0]中加入字符串 因此,输出将如下所示: Alexander Coughan 这是我的代码,但输出不是我想要的,它只是打印出来的 “无”: 我是这样写的

文件中的元组:

 ('Wanna', 'O')
 ('be', 'O')
 ('like', 'O')
 ('Alexander', 'B')
 ('Coughan', 'I')
 ('?', 'O')
我的问题是,如何将来自不同元组但在同一索引中具有条件的两个字符串连接起来

例如,在我的例子中,如果[1]等于'B'并后跟'i',我想在[0]中加入字符串

因此,输出将如下所示:

  Alexander Coughan
这是我的代码,但输出不是我想要的,它只是打印出来的 “无”:


我是这样写的:

from ast import literal_eval
from itertools import tee

def pairwise(iterable): # from itertools recipes
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

with open("a.txt") as f:
    for p0, p1 in pairwise(map(literal_eval, f)):
        if p0[1] == 'B' and p1[1] == 'I':
            print(' '.join(p0[0], p1[0]))
            break

原因如下:

您的文件由两个字符串的Python元组的
repr
s组成。这是一种非常糟糕的格式,如果您可以更改存储数据的方式,您应该这样做。但是如果太晚了,你不得不解析它,这是最好的答案

因此,我们通过对文件进行
map
ping
literal\u eval
操作,将文件中的每一行转换为一个元组

然后我们使用来自的
成对
将元组的iterable转换为相邻元组对的iterable

因此,现在,在循环中,
p0
p1
将是相邻行中的元组,您可以准确地编写您所描述的内容:如果
p0[1]
'B'
,然后是(也就是说,
p1[1]
是)
'I'
join
这两个
[0]
s


我不确定你想对连接的字符串做什么,所以我只是把它打印出来。我也不确定是要处理多个值还是只处理第一个值,因此我加入了一个
break

这是一个单行解决方案

>>> t = [ ('wanna', 'o'),
... ('be', 'o'),
... ('like', 'o'),
... ('Alexander', 'B'),
... ('Coughan', 'I'),
... ('?', 'o')]
>>> x = [B[0] for B in t if B[1]=='B'][0] + ' ' + [I[0] for I in t if I[1]=='I'][0]
>>> print x
Alexander Coughan
>>> 

我将扩展输入数据以包括更多的
'B'+'I'
示例

phrases = [('Wanna', 'O'),
    ('be', 'O'),
    ('like', 'O'),
    ('Alexander', 'B'),
    ('Coughan', 'I'),
    ('One', 'B'),
    ('Two', 'I'),
    ('Three', 'B')]

length = len(phrases)
res = ['%s %s' % (phrases[i][0], phrases[i + 1][0])
    for i in range(length)
    if i < length - 1 and phrases[i][1] == 'B' and phrases[i + 1][1] == 'I']
print(res)

当我去写我的时,我没有看到@MykhayloKopytonenko的解决方案,所以我的类似:

tuples = [('Wanna', 'O'),
          ('be', 'O'),
          ('like', 'O'),
          ('Alexander', 'B'),
          ('Coughan', 'I'),
          ('?', 'O'),
          ('foo', 'B'),
          ('bar', 'I'),
          ('baz', 'B'),]
results = [(t0[0], t1[0]) for t0, t1 in zip(tuples[:-1], tuples[1:])
                          if t0[1] == 'B' and t1[1] == 'I']
for r in results:
    print("%s %s" % r)
这将产生:

Alexander Coughan
foo bar
>>> 
如果必须将结果作为字符串返回,请将列表更改为:

 results = ["%s %s" % (t0, t1) for t0, t1 in zip(tuples[:-1], tuples[1:])
                               if t0[1] == 'B' and t1[1] == 'I']

这利用了这样一个事实,即根据您的条件,元组列表的最后一个元素将永远不会作为结果集的第一个元素返回。因此,
zip
有效地引导您通过
(元组[n],元组[n+1])
,以便您可以轻松检查值。

什么是“输出不好”意思是?请包括一些更多的示例:什么样的对会因为什么而被连接?我的意思是输出与我想要的不一样,它只是打印出来的,尽管标准不明确-如果nameq='I-NP'那里有一个
。。。您希望它做什么?如果索引[1]中的字符串等于“B”,后面跟着“I”,那么这些对将是索引[0]中的字符串。对于我的案例,我需要输出打印Alexander Coughan@TichodromaThanks以获得额外帮助
Alexander Coughan
foo bar
>>> 
 results = ["%s %s" % (t0, t1) for t0, t1 in zip(tuples[:-1], tuples[1:])
                               if t0[1] == 'B' and t1[1] == 'I']