Sat*_*tya 5 python concatenation
问题背景
我正在尝试从Whatsapp聊天创建聊天日志数据集.让我只提供我想要解决的问题的背景.假设消息是M和响应R.聊天发生的自然方式并不总是交替,例如聊天倾向于这样发生
[ M, M, M, R, R, M, M, R, R, M ... and so on]
我试图连接M和R的连续发生的字符串.对于上面的例子,我希望这样的输出
期望的输出
[ "M M M", "R R", "M M" , "R R", "M ... and so on ]
现实数据的一个例子:
Run Code Online (Sandbox Code Playgroud)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)
有没有一种快速,有效的方法呢?我已经读过这个Stackoverflow链接来解决这个问题.但是,我没有在那里找到解决方案.
到目前为止,这是我尝试过的.
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 = ''
Run Code Online (Sandbox Code Playgroud)
我的代码说明:我有一个chats列表,其中每条消息的起始字符是'M',每个响应的起始字符是'R'.我跟踪列表中的prev值和current值,当有变化时(从M - > R或R - > M转换),我将收集的所有内容附加continuous_string到final列表中.
同样,我的问题是: Python或函数中是否有一个快捷方式可以在较少的行数中有效地执行相同的操作?
你可以使用这个功能groupby():
from itertools import groupby
l = ['A', 'A', 'B', 'B']
[' '.join(g) for _, g in groupby(l)]
# ['A A', 'B B']
Run Code Online (Sandbox Code Playgroud)
要对实际数据进行分组,您需要添加一个键:
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?']
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的@TrebuchetMS,关键groupby()可能更可靠.这取决于您的数据.