问题上下文
我正在尝试从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中是否存在快捷方式或函数,可以用更少的行数有效地完成相同的操作?
答案 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?']