有没有更好的方法来连接Python中的连续字符串元素?

时间:2019-02-24 13:18:22

标签: python concatenation

问题上下文

我正在尝试从Whatsapp聊天创建聊天记录数据集。让我只提供我要解决的问题的上下文。假设消息为if ( player.pos.x < ball.pos.x + ball.size.x && player.pos.x + player.size.x > ball.pos.x && player.pos.y < ball.pos.y + ball.size.y && player.size.y + player.pos.y > ball.pos.y ) { ball.vel.x = -ball.vel.x; } ,响应为M。进行聊天的自然方式并不总是交替的,例如聊天往往会像这样

R

我正在尝试连接连续出现的M和R字符串。 对于上面的示例,我希望这样的输出

所需的输出

  

[ M, M, M, R, R, M, M, R, R, M ... and so on]

真实数据示例:

[ "M M M", "R R", "M M" , "R R", "M ... and so on ]

是否有更快,更有效的方法? 我已经读过this Stackoverflow link来解决此问题。但是,我在那里找不到解决方案。

到目前为止,这是我尝试过的

Input --> ["M: Hi", "M: How are you?", "R: Heyy", "R: Im cool", "R: Wbu?"] (length=5)

Output --> ["M: Hi M: How are you?", "R: Heyy R: Im cool R: Wbu?"] (length = 2)

我的代码说明: 我有final= [] temp = '' change = 0 for i,ele in enumerate(chats): if i>0: prev = chats[i-1][0] current = ele[0] if current == prev: continuous_string += chats[i-1] continue else: continuous_string += chats[i-1] final.append(temp) temp = '' 列表,其中每个消息的起始字符为“ M”,每个响应的起始字符为“ R'。我跟踪列表中的chats值和prev值,然后进行更改(从M-> R或R-> M过渡)时,我将收集在{{ 1}}到current列表。

再次,我的问题是: Python中是否存在快捷方式或函数,可以用更少的行数有效地完成相同的操作?

2 个答案:

答案 0 :(得分:5)

您可以使用函数groupby()

from itertools import groupby

l = ['A', 'A', 'B', 'B']

[' '.join(g) for _, g in groupby(l)]
# ['A A', 'B B']

要对现实数据进行分组,您需要添加一个键:

l = ["M: Hi", "M: How are you?", "R: Heyy", "R: Im cool", "R: Wbu?"]

[' '.join(g) for _, g in groupby(l, key=lambda x: x[0])]
# ['M: Hi M: How are you?', 'R: Heyy R: Im cool R: Wbu?']

正如@TrebuchetMS在评论中提到的那样,密钥lambda x: x.split(':')[0]可能更可靠。这取决于您的数据。

答案 1 :(得分:2)

算法

  • 初始化一个临时项目。这将有助于确定扬声器是否已更改
  • 对于每个项目
    • 吸引演讲者
    • 如果相同,则追加到数组最后一项的文本
    • 否则,在列表中添加一个新内容,其中包含发言人和文字

实施

def parse(x):
    parts = x.split(':')
    return parts[0], ' '.join(parts[1:]).strip()


def compress(l):
    ans = []
    prev = ''
    for x in l:
        curr, text = parse(x)
        if curr != prev:
            prev = curr
            ans.append(x)
        else:
            ans[len(ans) - 1] += f' {text}'
    return ans

字符名称

IN:  ["M: Hi", "M: How are you?", "R: Heyy", "R: Im cool", "R: Wbu?"]
OUT: ['M: Hi How are you?', 'R: Heyy Im cool Wbu?']

字符串名称

IN:  ["Mike: Hi", "Mike How are you?", "Mary: Heyy", "Mary: Im cool", "Mary: Wbu?"]
OUT: ['Mike: Hi How are you?', 'Mary: Heyy Im cool Wbu?']