mmmaceo
mmmaceo

Reputation: 151

'Splitting' List into several Arrays

I'm trying to complete a Project that will show total annual sales from an specific list contained in a .txt file.

The list is formatted this way:

-lastname, firstname (string)
-45.7 (float)
-456.4 (float)
-345.5 (float)
-lastname2, firstname2 (string)
-3354.7 (float)
-54.6 (float)
-56.2 (float)
-lastname3, firstname3 (string)
-76.6 (float)
-34.2 (float)
-48.2 (float)

And so on.... Actually, 7 different "employees" followed by 12 set of "numbers" (months of the year)....but that example should suffice to give an idea of what I'm trying to do.

I need to output this specific information of every "employee" -Name of employee -Total Sum (sum of the 12 numbers in the list)

So my logic is taking me to this conclusion, but I don't know where to start:

Create 7 different arrays to store each "employee" data. With this logic, I need to split the main list into independent arrays so I can work with them.

How can this be achieved? And also, if I don't have a predefined number of employees (but a defined format :: "Name" followed by 12 months of numbers)...how can I achieve this?

I'm sure I can figure once I get an idea how to "split" a list in different sections -- Every 13 lines?

Upvotes: 1

Views: 195

Answers (3)

Rubens
Rubens

Reputation: 14768

Yes, at every thirteenth line you'd have the information of an employee.

However, instead of using twelve different lists, you can use a dictionary of lists, so that you wouldn't have to worry about the number of employees.

And you can either use a parameter on the number of lines directed to each employee.

You could do the following:

infile = open("file.txt", "rt")

employee = dict()
name = infile.readline().strip()
while name:

    employee[name] = list()

    for i in xrange(1, 12):
        val = float(infile.readline().strip())
        employee[name].append(val)

    name = infile.readline().strip()

Some ways to access dictionary entries:

for name, months in employee.items():
    print name
    print months

for name in employee.keys():
    print name
    print employee[name]

for months in employee.values():
    print months

for name, months in (employee.keys(), employee.values()):
    print name
    print months

The entire process goes as follows:

infile = open("file.txt", "rt")

employee = dict()
name = infile.readline().strip()
while name:

    val = 0.0
    for i in xrange(1, 12):
        val += float(infile.readline().strip())
    employee[name] = val

    print ">>> Employee:", name, " -- salary:", str(employee[name])
    name = infile.readline().strip()

Sorry for being round the bush, somehow (:

Upvotes: 3

Victor Zamanian
Victor Zamanian

Reputation: 3180

I would not create 7 different arrays. I would create some sort of data structure to hold all the relevant information for one employee in one data type (this is python, but surely you can create data structures in python as well).

Then, as you process the data for each employee, all you have to do is iterate over one array of employee data elements. That way, it's much easier to keep track of the indices of the data (or maybe even eliminates the need to!).

This is especially helpful if you want to sort the data somehow. That way, you'd only have to sort one array instead of 7.

Upvotes: 0

akaRem
akaRem

Reputation: 7618

Here is option. Not good, but still brute option.

summed = 0
with open("file.txt", "rt") as f:
    print f.readline() # We print first line (first man) 
    for line in f:
        # then we suppose every line is float.
        try:                             
            # convert to float
            value = float(line.strip())  
            # add to sum
            summed += value              
        # If it does not convert, then it is next person
        except ValueError: 
            # print sum for previous person
            print summed
            # print new name
            print line
            # reset sum
            summed = 0
    # on end of file there is no errors, so we print lst result
    print summed

since you need more flexibility, there is another option:

    data = {} # dict: list of all values for person by person name
    with open("file.txt", "rt") as f:
        data_key = f.readline() # We remember first line (first man)
        data[data_key] = [] # empty list of values
        for line in f:
            # then we suppose every line is float.
            try:                             
                # convert to float
                value = float(line.strip())  
                # add to data
                data[data_key].append(value)
            # If it does not convert, then it is next person
            except ValueError: 
                # next person's name
                data_key = line
                # new list
                data[data_key] = []

Q: let's say that I want to print a '2% bonus' to employees that made more than 7000 in total sales (12 months)

for employee, stats in data.iteritems():
    if sum(stats) > 7000:
        print employee + " done 7000 in total sales! need 2% bonus"

Upvotes: 1

Related Questions