I was learning how to use loops and was doing this program for practice. However, the only thing I am having some difficulty with is printing the list only once for each input correctly. Here is my code:
country_list=[]
emission_list=[]
capita_list=[]
total=0
end_loop=False
together=[]
while True:
country=raw_input("Enter country or (done to end): ")
if country=="done":
break
else:
emission=input("Enter emissions: ")
capita=input("Enter capita: ")
country_list.append(country)
emission_list.append(emission)
capita_list.append(capita)
total+=1
for x in range(len(country_list)):
for y in range(len(emission_list)):
for z in range(len(capita_list)):
end_loop=True
print country_list[x]+": Emission="+str(emission_list[y]),"and Capita="+str(capita_list[z])
I am inputting this:
Enter country or (done to end): Testcase
Enter emissions: 1
Enter capita: 2
Enter country or (done to end): Testcase2
Enter emissions: 3
Enter capita: 4
Enter country or (done to end): done
This is the output I am getting:
Testcase: Emission=1 and Capita=2
Testcase: Emission=1 and Capita=4
Testcase: Emission=3 and Capita=2
Testcase: Emission=3 and Capita=4
Testcase2: Emission=1 and Capita=2
Testcase2: Emission=1 and Capita=4
Testcase2: Emission=3 and Capita=2
Testcase2: Emission=3 and Capita=4
It is printing all possible combinations of the emissions and capita but I only want it to print what I inputted as emissions/capita for each country. Anyone know how to fix this?
3 Answers 3
This is ok as a learning exercise, but the Pythonic way to perform this task is to use zip.
for cnty, em, cap in zip(country_list, emission_list, capita_list):
print "{}: Emission={} and Capita={}".format(cnty, em, cap)
Actually you should store the results that way (a list of 3-tuples) instead of with three lists that you zip together later.
cecs = []
while True:
country = raw_input("Enter country (or nothing to end): ").strip()
if not country:
break
emission = input("Enter emissions: ").strip()
capita = input("Enter capita: ").strip()
cecs.append((country, emission, capita))
# total = len(cecs)
for cec in cecs:
print "{}: Emission={} and Capita={}".format(*cec)
Comments
Instead of doing this:
for x in range(len(country_list)):
for y in range(len(emission_list)):
for z in range(len(capita_list)):
print country_list[x]+": Emission="+str(emission_list[y]),"and Capita="+str(capita_list[z])
Do this:
for x in range(len(country_list)):
print country_list[x]+": Emission="+str(emission_list[x]),"and Capita="+str(capita_list[x])
Note: Your code will be more meaningfully structured if you create a class that has one country name, one emission and one capita. Then a mistake like this would be impossible since you'd only have one list of objects to iterate over, anyway.
1 Comment
I'd rather use a dictionary instead. It'd look like something like this:
countries = {}
while True:
inp = input("Enter country or (done to end): ")
if inp == 'done':
break;
countries[inp] = {'emission': input("Enter emissions: ")}
countries[inp]['capita'] = input("Enter capita: ")
for i in countries:
print(i, 'Emission:', countries[i]['emission'],
'and Capita', countries[i]['capita'])
Input:
Enter country or (done to end): test
Enter emissions: 1
Enter capita: 2
Enter country or (done to end): test2
Enter emissions: 3
Enter capita: 4
Enter country or (done to end): done
Ouput:
test Emission: 1 and Capita 2
test2 Emission: 3 and Capita 4
At the end the dictionary looks like that:
{'test': {'emission': '1', 'capita': '2'}, 'test2': {'emission': '3', 'capita': '4'}}