Python Forum
Repeating elements when appending in iteration in Python 3.6 - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Homework (https://python-forum.io/forum-9.html)
+--- Thread: Repeating elements when appending in iteration in Python 3.6 (/thread-6920.html)



Repeating elements when appending in iteration in Python 3.6 - miguelsantana - Dec-13-2017

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".


RE: Repeating elements when appending in iteration in Python 3.6 - Mekire - Dec-14-2017

So, first I think you should read through this:
https://python-forum.io/Thread-Basic-Never-use-for-i-in-range-len-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-bipartite-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.


RE: Repeating elements when appending in iteration in Python 3.6 - Terafy - Dec-17-2017

(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):