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

2024-09-27 00:12:47 发布

您现在位置:Python中文网/ 问答频道 /正文

文件中的元组:

 ('Wanna', 'O')
 ('be', 'O')
 ('like', 'O')
 ('Alexander', 'B')
 ('Coughan', 'I')
 ('?', 'O')

我的问题是,如何用条件连接来自不同元组但在同一索引中的两个字符串?在

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

因此输出结果如下:

^{pr2}$

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

^{3}$

Tags: 文件字符串代码be条件例子like元组
3条回答

这里有一个单一的解决方案

>>> 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
>>> 

我是这样写的:

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

原因如下:

您的文件由两个字符串组成的reprs组成。这是一个非常糟糕的格式,如果你可以改变你存储数据的方式,你应该这样做。但是如果太晚了,您必须解析它,^{}是最好的答案。在

因此,我们通过mapping literal_eval将文件中的每一行转换为一个元组。在

然后我们使用^{} recipes中的pairwise将元组的iterable转换为相邻元组对的iterable。在

所以,现在,在循环中,p0和{}将是相邻行中的元组,您只需编写您所描述的内容:如果p0[1]'B',后面跟着(也就是说,p1[1]是)'I'join这两个{}s

我不知道你想怎么处理连接的字符串,所以我只是把它打印出来了。我也不确定是要处理多个值还是只处理第一个值,所以我放入了一个break。在

我将扩展输入数据以包含更多'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)

结果是:

^{pr2}$

相关问题 更多 >

    热门问题