Python Forum
Repeating elements when appending in iteration in Python 3.6
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Repeating elements when appending in iteration in Python 3.6
#1
I am trying to code a portion of code that gets the elements from two distinct lists and make a match, as you can see below, but for some reason, I keep getting repeated elements on my output lists.

def assign_tasks(operators, requests, current_time):
"""Assign operators to pending requests.

Requires:
- operators, a collection of operators, structured as the output of 
  filesReading.read_operators_file;
- requests, a list of requests, structured as the output of filesReading.read_requests_file;
- current_time, str with the HH:MM representation of the time for this update step.
Ensures: a list of assignments of operators to requests, according to the conditions indicated 
in the general specification (omitted here for the sake of readability).
"""
operators = sorted(operators, key=itemgetter(3, 4, 0), reverse=False)
requests = sorted(requests, key=itemgetter(3), reverse=True)
isAssigned = 0
tasks = []
langr = 0 #Variable that gets the language of the request's file (customer's language)
lango = 0 #Variable that gets the language of the operator's file (operator's language)
for i in range(len(requests)-1):
    langr = requests[i][1]                                   #What language does the customer speaks?
    for k in range(len(operators)-1):
        lango = operators[k][1]                              #What language does the operator speaks?
        if langr == lango:                                   #Do they speak the same language?
            for j in range(len(operators[k][2])-1):
                if (operators[k][2][j] == requests[i][2]) and (operators[k][4] <= 240):     # The operator knows how to solve the client's problem? If yes, then group them together.
                    a = operators[k][2][j]
                    b = requests[i][2]
                    tasks.append([current_time, requests[i][0], operators[k][0]])
                    operator_time = operators[k][4]
                    request_time = requests[i][4]
                    new_operator_time = operator_time + request_time
                    operators[k][4] = new_operator_time
                    isAssigned == True
                    #operators.remove(operators[k])
                    requests.remove(requests[i])
                else:
                    isAssigned = False
                if isAssigned == False:
                    tasks.append([current_time, requests[i][0], "not-assigned"])

    operators = sorted(operators, key=itemgetter(3, 4, 0), reverse=False)

return tasks, operators, requests
My current input is this:

operators = [['Atilio Moreno', 'portuguese', ('laptops',), '10:58', 104], ['Leticia Ferreira', 'portuguese', ('laptops',), '11:03', 15], ['Ruth Falk', 'german', ('phones', 'hifi'), '11:06', 150], ['Marianne Thibault', 'french', ('phones',), '11:09', 230], ['Mariana Santana', 'portuguese', ('phones',), '11:11', 230], ['Beate Adenauer', 'german', ('hifi', 'phones'), '11:12', 140], ['Zdenka Sedlak', 'czech', ('phones',), '11:13', 56], ['Romana Cerveny', 'czech', ('phones',), '11:13', 213]]
requests = [['Christina Holtzer', 'german', 'hifi', 'fremium', 7], ['Andrej Hlavac', 'czech', 'phones', 'fremium', 9], ['Dulce Chaves', 'portuguese', 'laptops', 'fremium', 15], ['Otavio Santiago', 'portuguese', 'laptops', 'fremium', 15], ['Dina Silveira', 'portuguese', 'phones', 'fremium', 9], ['Rafael Kaluza', 'slovenian', 'laptops', 'fremium', 13], ['Sabina Rosario', 'portuguese', 'laptops', 'fremium', 10], ['Nuno Rodrigues', 'portuguese', 'laptops', 'fremium', 12], ['Feliciano Santos', 'portuguese', 'phones', 'fremium', 12]]

current_time = "14:55 06:11:2017"
print(assign_tasks(operators, requests, current_time))
My current output is three lists where, for example, the first one is something like this:
[[11:05, Christina Holtzer, not-assigned],[11:05, Christina Holtzer, Beate Adenauer],[11:05, Andrej Hlavac, not-assigned]]
As you can see, it is assigning the same person to an operator and then get it "not-assigned".
Reply
#2
So, first I think you should read through this:
https://python-forum.io/Thread-Basic-Nev...n-sequence
and this:
http://nedbatchelder.com/text/iter.html

Half of the reason this is getting so messy is your iteration method.
Also you are trying to change the size of what you are iterating over as you iterate (removing people from requests inside a loop over the size of requests).  Try maintaining a set of assigned reqs and checking against that instead.

Overall I'm not really sure this is the best approach to the problem in general but that really depends on what your instructor is aiming at.
It seems like you could apply bipartite matching ideas, as your current greedy solution won't be optimal:  
http://www.geeksforgeeks.org/maximum-bip...-matching/
but then it also seems like the problem in general would be better composed as a kind of producer-consumer pattern.

First try cleaning up your iteration and see if you can't clear things up a bit.  The third nested loop seems completely unnecessary as you can just check say, if job in jobs.
Reply
#3
(Dec-13-2017, 08:17 PM)miguelsantana Wrote: My current output is three lists where, for example, the first one is something like this:
[[11:05, Christina Holtzer, not-assigned],[11:05, Christina Holtzer, Beate Adenauer],[11:05, Andrej Hlavac, not-assigned]]
As you can see, it is assigning the same person to an operator and then get it "not-assigned".

For the first output:
In line 22, you code detect if the operator and requester spoke the same language. Then your code runs to see if the operator is able to help. If the operator was unable then it would produce [11:05, Christina Holtzer, not-assigned].

However, the if statement in line 24 didn't detected Christina Holtzer and Ruth Falk. Which both spoke german and the topic is hifi.

Try changing it to:
if (operators[k][2][j] in requests[i][2]) and (operators[k][4] <= 240): 
When my code doesn't work I don't know why **think** and when my code works I don't know why **think**
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Subtracting Elements of a Sublist in Python 3 pangloss3030 3 1,951 Dec-31-2020, 03:37 PM
Last Post: buran
  repeating pastakipp 1 1,534 Oct-24-2020, 03:28 PM
Last Post: jefsummers
  Simple fixed point iteration root finding in python DoctorSmiles 3 9,593 Jul-11-2020, 04:08 AM
Last Post: ndc85430
  How would I go about repeating/looping this code? azulu 5 2,103 Mar-23-2020, 02:26 AM
Last Post: azulu

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020