generating unique variable name via loops

Peter Otten __peter__ at web.de
Tue Nov 4 11:06:25 EST 2014


Fatih Güven wrote:

> 4 Kasım 2014 Salı 17:01:17 UTC+2 tarihinde Peter Otten yazdı:
>> Fatih Güven wrote:
>> 
>> > 4 Kasım 2014 Salı 15:37:59 UTC+2 tarihinde Peter Otten yazdı:
>> >> Veek M wrote:
>> >> 
>> >> > Fatih Güven wrote:
>> >> > 
>> >> >> 4 Kas?m 2014 Sal? 13:29:34 UTC+2 tarihinde Fatih Güven yazd?:
>> >> >>> I want to generate a unique variable name for list using python.
>> >> >>> 
>> >> >>> list1=...
>> >> >>> list2=...
>> >> > 
>> >> > for x in range(1,10):
>> >> >     exec("list%d = []" % x)
>> >> 
>> >> Why would you do this?
>> > 
>> > I have a structured and repetitive data.
>> 
>> I was actually asking "Veek M".
>> 
>> > I want to read a .txt file line
>> > by line and classified it to call easily. For example employee1 has a
>> > name, a salary, shift, age etc. and employee2 and other 101 employee
>> > have all of it.
>> > 
>> > Call employee1.name or employee2.salary and assign it to a new
>> > variable, something etc.
>> 
>> I can only repeat my previous advice. Instead of creating variables for
>> employee1, employee2, and so on make a list of employees:
>> 
>> $ cat employees.txt
>> Peter,3000
>> Paul,2000
>> Mary,1000
>> 
>> $ cat employees.py
>> #!/usr/bin/env python3
>> import csv
>> 
>> class Employee:
>>     def __init__(self, name, salary):
>>         self.name = name
>>         self.salary = salary
>> 
>> if __name__ == "__main__":
>>     employees = []
>>     with open("employees.txt") as f:
>>         for row in csv.reader(f):
>>             employees.append(Employee(row[0], int(row[1])))
>> 
>>     for employee in employees:
>>         print(employee.name, "-- salary:", employee.salary, "doubloons")
>> 
>> $ python3 employees.py
>> Peter -- salary: 3000 doubloons
>> Paul -- salary: 2000 doubloons
>> Mary -- salary: 1000 doubloons
>> 
>> You wouldn't want to reference Paul as employee2 -- what if the order in
>> the text file changed? Instead you can make a dict that maps name to
>> employee...
>> 
>>     employees_by_name = {}
>>     for employee in employees:
>>         name = employee.name
>>         if name in employees_by_name:
>>             raise ValueError("duplicate name {}".format(name))
>>         employees_by_name[name] = employee
>> 
>> and use that dict to look up an employee:
>> 
>>     while True:
>>         name = input("enter a name ")
>>         if name == "":
>>             print("That's all folks")
>>             break
>>         if name not in employees_by_name:
>>             print("unknown name")
>>         else:
>>             print("Salary:", employees_by_name[name].salary, "doubloons")
>> 
>> $ python3 employees.py
>> Peter -- salary: 3000 doubloons
>> Paul -- salary: 2000 doubloons
>> Mary -- salary: 1000 doubloons
>> enter a name Peter
>> Salary: 3000 doubloons
>> enter a name Mary
>> Salary: 1000 doubloons
>> enter a name paul
>> unknown name
>> enter a name Paul
>> Salary: 2000 doubloons
>> enter a name
>> That's all folks
>> $
> 
> 
> Thanks for your concern, I will try this. Actually, the main focus is that
> are there any other Paul in my team. So i want to create a simple ID for
> employee to distinguish two Paul. I belive that you have a solution for
> this.

The easiest is to use the index:

#!/usr/bin/env python3
import csv

class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

if __name__ == "__main__":
    employees = []
    with open("employees.txt") as f:
        for row in csv.reader(f):
            employees.append(Employee(row[0], int(row[1])))

    for index, employee in enumerate(employees, 1):
        print("#{}, name: {}".format(index, employee.name))

    while True:
        index = input("enter an index (1...{}) ".format(len(employees)))
        if index == "":
            print("That's all folks")
            break
        index = int(index) -1
        employee = employees[index]
        print("Name: {0.name}, Salary: {0.salary}".format(employee))

If the ID must stay the same for two runs of the script you have to put it 
into the text file as another column. However, you are soon reaching 
territory where a database is more convenient than a text file.




More information about the Python-list mailing list