Tengo una lista que contiene una conversación de chat entre el agente y el cliente.

chat = ['agent',
        'Hi',
        'how may I help you?',
        'customer',
        'I am facing issue with internet',
        'agent',
        'Can i know your name and mobile no.?'
        'customer',
        'john doe',
        '111111',..... ]

Esta es una muestra de la lista de chat.

Estoy buscando dividir la lista en dos partes, agent_chat y customer_chat, donde agent_chat contiene todas las líneas que dijo el agente, y customer_chat contiene las líneas que dijo el cliente.

Algo como esto (salida final).

agent_chat = ['Hi','how may I help you?','Can i know your name and mobile no.?'...]
customer_chat = ['I am facing issue with internet','john doe','111111',...]

Estoy enfrentando problemas al resolver esto, intenté usar el método list.index () para dividir la lista de chat en función de los índices, pero obtengo varios valores para el mismo índice.

Por ej. [chat.index(l) for l in chat if l=='agent'] Devuelve: [0, 0], ya que solo me da la primera aparición.

¿Existe una mejor manera de lograr el resultado deseado?

-1
Shubham R 15 mar. 2021 a las 10:13

5 respuestas

La mejor respuesta

Esta sería mi solución a tu problema.

chat = ['agent',
        'Hi',
        'how may I help you?',
        'customer',
        'I am facing issue with internet',
        'agent',
        'Can i know your name and mobile no.?',
        'customer',
        'john doe',
        '111111']

agent_list = []
customer_list = []

agent = False
customer = False
for message in chat:
    if message == 'agent':
        agent = True
        customer = False
    elif message == 'customer':
        agent = False
        customer = True
    elif agent:
        agent_list.append(message)
    elif customer:
        customer_list.append(message)
    else:
        pass
1
Nuran 15 mar. 2021 a las 07:21

index() devuelve solo el primer índice del elemento, por lo que deberá acumular el índice de todas las ocurrencias iterando sobre la lista.

Sugeriría resolver esto usando un bucle for simple como:

agent_chat = []
customer_chat = []
chat_type = 'agent'
for chat in chats:
    if chat in ['agent', 'customer']:
        chat_type = chat
        continue
        
    if chat_type == 'agent':
        agent_chat.append(chat)
    else:
        customer_chat.append(chat)
    
print(agent_chat)
print(customer_chat)

Otros enfoques, como la comprensión de listas, requerirán dos iteraciones de la lista.

6
Krishna Chaurasia 15 mar. 2021 a las 07:22

Esta es mi solución. No sé que este es el mejor, pero espero que ayude.

def chat_lists(chat):
agent_chat = []
customer_chat = []

user_flag = ""
for message in chat:
    if message == 'agent':
        user_flag = 'agent'
    elif  message == 'customer':
        user_flag = 'customer'
    else :
        if user_flag == 'agent':
            agent_chat.append(message)
        else:
            customer_chat.append(message)
return customer_chat, agent_chat
0
berkeeb 15 mar. 2021 a las 07:29

Puedes hacer algo como esto.

chat = ['agent',
    'Hi',
    'how may I help you?',
    'customer',
    'I am facing issue with internet',
    'agent',
    'Can i know your name and mobile no.?'
    'customer',
    'john doe',
    '111111']
    agent = []
    customer = []
    
    for j in chat:
        if j=='agent':
            curr = 'agent'
            continue
        if j=='customer':
            curr = 'customer'
            continue
        if(curr=='agent'):
            agent.append(j)
        else:
            customer.append(j)
    
  print(agent)
  print(customer)
0
naresh_321 15 mar. 2021 a las 07:45

Puede configurar un bucle while para analizar los mensajes y configurar una variable para que actúe como un "interruptor" para determinar si el agente o el cliente están hablando.

# Get the current speaker (first speaker)
current_speaker = chat[0]

# Make the chat logs
agent_chat = []
customer_chat = []

# Iterate for the array
for message in chat:
    # If the current speaker is updated
    if message in ['agent', 'customer']:
        # Then update the speaker
        current_speaker = message
        # Skip to the next iteration
        continue

    # Add the message based 
    if current_speaker == 'agent':
        agent_chat.append(message)
    else:
        customer_chat.append(message)

Otra nota a tener en cuenta es que todo este sistema fallará mucho si un cliente o agente decide, por cualquier motivo, escribir la palabra "agente" o "cliente".

-1
Xiddoc 15 mar. 2021 a las 07:30