Re: [Tutor] Indexing a list with nested tuples
My bad- meant to say [1]. Thanks. -Alexander On Fri, Aug 5, 2011 at 12:36 PM, Christopher King wrote: > > > On Tue, Aug 2, 2011 at 10:44 PM, Alexander Quest wrote: >> >> have [0] to indicate that I want to go to the second value within that >> first item, which is the >> point value >> > Actually [0] is the first element. I would go with [1]. > > > ___ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > http://mail.python.org/mailman/listinfo/tutor > > ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Indexing a list with nested tuples
On Tue, Aug 2, 2011 at 10:44 PM, Alexander Quest wrote: > > have [0] to indicate that I want to go to the second value within that > first item, which is the > point value > Actually [0] is the first element. I would go with [1]. ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Indexing a list with nested tuples
Hi Bob- thanks for the reply again. I apologize about not "replying all" last time- still getting in the habit of doing this. I am using Python version 3.1. As far as tuples are concerned, I don't NEED to use them, but I am trying to get some practice with them. This is because I am following an instructional book that is discussing nested tuples within lists. The way I get the "selection" variable from the user is just by typing the following: selection = input("Selection: ") I'm not sure why it reads it initially as a string, but I later included the line selection = int(selection), which solved the int/str problem. Also, I was about to switch to dictionaries or just lists without tuples, but another poster above stated that I could just replace the entire tuple item within the list, which technically would not be changing the tuple, so it worked out. The only problem I have now is trying to sort the 4 attributes based on their numerical value, not their alphabetical value. But when I type in attributes.sort(reverse=True), it sorts them alphabetically because the name of the attribute is 1st in the list, and its value is 2nd. Here it is again for reference: attributes = [("strength", 0), ("health ", 0), ("wisdom ", 0), ("dexterity", 0)] Sorry if this is a bit confusing. Thanks for your help and tips so far Bob. -Alex On Wed, Aug 3, 2011 at 5:52 AM, bob gailer wrote: > On 8/2/2011 11:39 PM, Alexander Quest wrote: > > Hey Bob- thanks for the reply. Here is a more complete part of that code > section (the ellipses are parts where I've deleted code because I don't > think it's important for this question): > > > Please always reply-all so a copy goes to the list. > > Thanks for posting more code & traceback > > I forgot to mention earlier - tell us which version of Python you are using > (this looks like version 3) > > You did not answer all my questions! How come? Please do so now. > > > > _ > attributes = [("strength", 0), ("health ", 0), ("wisdom ", 0), > ("dexterity", 0)] > . > . > . > print( > """ > 1 - Strength > 2 - Health > 3 - Wisdom > 4 - Dexterity > > Any other key - Quit > """ > ) > selection = input("Selection: ") > if selection == "1" or selection == "2" or selection == "3" or selection == > "4": > print("You have ", points, "points available.") > how_many = input("How many would you like to add to this > attribute?: ") > while how_many < 0 or how_many > 30 or how_many == > "": # Because max points available is 30, and > entering less than 0 does not make sense. > print("Invalid entry. You have ", points, "points > available.") # If the user enters a number > less than 0, greater than 30, or just presses enter, it loops. > how_many = input("How many would you like to add to > this attribute?: ") > print("Added ", points, "to ", attributes[selection-1][0], > "attribute.") # Here is where I try to add the > number of points to the value, based on what the user entered. > points = points - > how_many > # I subtract the number of points added from the total points available. > attributes[selection-1][1] += > how_many # I > add the number of points the user selected to the variable selected. > > > __ > > > Here's the traceback I get: > > Traceback (most recent call last): > File "C:\Users\Alexander\Desktop\Python Practice\Ch05-2.py", line 54, in > > print("Added ", points, "to ", attributes[selection-1][0], > "attribute.") > TypeError: unsupported operand type(s) for -: 'str' and 'int' > _ > > Thanks for any help. I understand that I can't change tuples directly, but > is there a way to change them indirectly (like saying attribute.remove[x] > and then saying attribute.append[x] with the new variable? But this seems to > take out both the string and the value, when I only want to increase or > decrease the value for one of the 4 strings, strength, health, wisdom, or > dexterity). > > > DON'T USE TUPLES. WHY DO YOU INSIST ON THEM? > > > >> What does the error message( unsupported operand type(s) for -: 'str' and >> 'int') tell you? > > > Why would selection be a string rather than an integer? > > > This has to do with how you obtain selection from the user. >> >> Why did you expect to be able to alter the value of a tuple element? >> Tuples are immutable! Use a list instead. >> >> > -- > Bob Gailer919-636-4239 > Chapel Hill NC > > ___ Tutor
Re: [Tutor] Indexing a list with nested tuples
Thanks Peter- I tried the replacement method where the entire tuple is replaced with a new one and that worked. Changing the "attribute_index" (or "selection" variable, as I called it) to an integer removed the int/str errors. -Alex On Wed, Aug 3, 2011 at 12:12 AM, Peter Otten <__pete...@web.de> wrote: > Alexander Quest wrote: > > > Hi guys- I'm having a problem with a list that has nested tuples: > > > > attributes = [("strength", 0), ("health ", 0), ("wisdom ", 0), > > ("dexterity", 0)] > > > > I've defined the list above with 4 items, each starting with a value of > 0. > > The player > > enters how many points he or she wants to add to a given item. The > > selection menu > > is 1 - strength; 2 - health; 3 - wisdom; 4- dexterity. So the "selection" > > variable is actually > > 1 more than the index location of the intended item. So I have the > > following code: > > > > print("Added ", points, "to ", attributes[selection-1][0], "attribute.") > > > > My intent with this is to say that I've added this many points (however > > many) to the > > corresponding item in the list. So if the player selects "1", then > > selection = 1, but I subtract > > 1 from that (selection -1) to get the index value of that item in the > list > > (in this case 0). Then I > > have [0] to indicate that I want to go to the second value within that > > first item, which is the > > point value. I get an error saying that list indices must be integers, > not > > strings. I get a similar > > error even if I just put attributes[selection][0] without the minus 1. > > > > Also, it seems that the tuple within the list cannot be modified > directly, > > so I can't add points to the original value of "0" that all 4 items start > > with. Is there a way to keep this nested list with > > tuples but be able to modify the point count for each item, or will it be > > better to create a dictionary or 2 separate lists (1 for the names > > "Strength, Health, Wisdom, Dexterity" and one > > for their starting values "0,0,0,0")? Any suggestions/help will be > greatly > > appreciated!!! > > [I'm assuming you are using Python 3. If not replace input() with > raw_input()] > > Let's investigate what happens when you enter an attribute index: > > >>> attribute_index = input("Choose attribute ") > Choose attribute 2 > >>> attribute_index > '2' > > Do you note the '...' around the number? > > >>> attribute_index -= 1 > Traceback (most recent call last): > File "", line 1, in > TypeError: unsupported operand type(s) for -=: 'str' and 'int' > > It's actually a string, not an integer; therefore you have to convert it to > an integer before you can do any math with it: > > >>> attribute_index = int(attribute_index) > >>> attribute_index > 2 > >>> attribute_index -= 1 > >>> attribute_index > 1 > > Now let's try to change the second tuple: > > >>> attributes = [ > ... ("strength", 0), ("health", 0), ("wisdom", 0), ("dexterity", 0)] > >>> attributes[attribute_index] > ('health', 0) > >>> attributes[attribute_index][1] += 42 > Traceback (most recent call last): > File "", line 1, in > TypeError: 'tuple' object does not support item assignment > > The error message is pretty clear, you cannot replace items of a tuple. > You can either to switch to nested lists > > [["strength", 0], ["health", 0], ...] > > or replace the entire tuple with a new one: > > >>> name, value = attributes[attribute_index] > >>> attributes[attribute_index] = name, value + 42 > >>> attributes > [('strength', 0), ('health', 42), ('wisdom', 0), ('dexterity', 0)] > > However, I think the pythonic way is to use a dictionary. If you want the > user to input numbers you need a second dictionary to translate the numbers > into attribute names: > > >>> attributes = dict(attributes) > >>> lookup = {1: "strength", 2: "health", 3: "wisdom", 4: "dexterity"} > >>> while True: > ... index = input("index ") > ... if not index: break > ... amount = int(input("amount ")) > ... name = lookup[int(index)] > ... attributes[name] += amount > ... > index 1 > amount 10 > index 2 > amount 20 > index 3 > amount 10 > index 2 > amount -100 > index > >>> attributes > {'dexterity': 0, 'strength': 10, 'health': -38, 'wisdom': 10} > > Personally I would ask for attribute names directly. > > ___ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > http://mail.python.org/mailman/listinfo/tutor > ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Indexing a list with nested tuples
On 8/2/2011 11:39 PM, Alexander Quest wrote: Hey Bob- thanks for the reply. Here is a more complete part of that code section (the ellipses are parts where I've deleted code because I don't think it's important for this question): Please always reply-all so a copy goes to the list. Thanks for posting more code & traceback I forgot to mention earlier - tell us which version of Python you are using (this looks like version 3) You did not answer all my questions! How come? Please do so now. _ attributes = [("strength", 0), ("health ", 0), ("wisdom ", 0), ("dexterity", 0)] . . . print( """ 1 - Strength 2 - Health 3 - Wisdom 4 - Dexterity Any other key - Quit """ ) selection = input("Selection: ") if selection == "1" or selection == "2" or selection == "3" or selection == "4": print("You have ", points, "points available.") how_many = input("How many would you like to add to this attribute?: ") while how_many < 0 or how_many > 30 or how_many == "": # Because max points available is 30, and entering less than 0 does not make sense. print("Invalid entry. You have ", points, "points available.") # If the user enters a number less than 0, greater than 30, or just presses enter, it loops. how_many = input("How many would you like to add to this attribute?: ") print("Added ", points, "to ", attributes[selection-1][0], "attribute.") # Here is where I try to add the number of points to the value, based on what the user entered. points = points - how_many # I subtract the number of points added from the total points available. attributes[selection-1][1] += how_many # I add the number of points the user selected to the variable selected. __ Here's the traceback I get: Traceback (most recent call last): File "C:\Users\Alexander\Desktop\Python Practice\Ch05-2.py", line 54, in print("Added ", points, "to ", attributes[selection-1][0], "attribute.") TypeError: unsupported operand type(s) for -: 'str' and 'int' _ Thanks for any help. I understand that I can't change tuples directly, but is there a way to change them indirectly (like saying attribute.remove[x] and then saying attribute.append[x] with the new variable? But this seems to take out both the string and the value, when I only want to increase or decrease the value for one of the 4 strings, strength, health, wisdom, or dexterity). DON'T USE TUPLES. WHY DO YOU INSIST ON THEM? What does the error message( unsupported operand type(s) for -: 'str' and 'int') tell you? Why would selection be a string rather than an integer? This has to do with how you obtain selection from the user. Why did you expect to be able to alter the value of a tuple element? Tuples are immutable! Use a list instead. -- Bob Gailer 919-636-4239 Chapel Hill NC ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Indexing a list with nested tuples
Alexander Quest wrote: > Hi guys- I'm having a problem with a list that has nested tuples: > > attributes = [("strength", 0), ("health ", 0), ("wisdom ", 0), > ("dexterity", 0)] > > I've defined the list above with 4 items, each starting with a value of 0. > The player > enters how many points he or she wants to add to a given item. The > selection menu > is 1 - strength; 2 - health; 3 - wisdom; 4- dexterity. So the "selection" > variable is actually > 1 more than the index location of the intended item. So I have the > following code: > > print("Added ", points, "to ", attributes[selection-1][0], "attribute.") > > My intent with this is to say that I've added this many points (however > many) to the > corresponding item in the list. So if the player selects "1", then > selection = 1, but I subtract > 1 from that (selection -1) to get the index value of that item in the list > (in this case 0). Then I > have [0] to indicate that I want to go to the second value within that > first item, which is the > point value. I get an error saying that list indices must be integers, not > strings. I get a similar > error even if I just put attributes[selection][0] without the minus 1. > > Also, it seems that the tuple within the list cannot be modified directly, > so I can't add points to the original value of "0" that all 4 items start > with. Is there a way to keep this nested list with > tuples but be able to modify the point count for each item, or will it be > better to create a dictionary or 2 separate lists (1 for the names > "Strength, Health, Wisdom, Dexterity" and one > for their starting values "0,0,0,0")? Any suggestions/help will be greatly > appreciated!!! [I'm assuming you are using Python 3. If not replace input() with raw_input()] Let's investigate what happens when you enter an attribute index: >>> attribute_index = input("Choose attribute ") Choose attribute 2 >>> attribute_index '2' Do you note the '...' around the number? >>> attribute_index -= 1 Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s) for -=: 'str' and 'int' It's actually a string, not an integer; therefore you have to convert it to an integer before you can do any math with it: >>> attribute_index = int(attribute_index) >>> attribute_index 2 >>> attribute_index -= 1 >>> attribute_index 1 Now let's try to change the second tuple: >>> attributes = [ ... ("strength", 0), ("health", 0), ("wisdom", 0), ("dexterity", 0)] >>> attributes[attribute_index] ('health', 0) >>> attributes[attribute_index][1] += 42 Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment The error message is pretty clear, you cannot replace items of a tuple. You can either to switch to nested lists [["strength", 0], ["health", 0], ...] or replace the entire tuple with a new one: >>> name, value = attributes[attribute_index] >>> attributes[attribute_index] = name, value + 42 >>> attributes [('strength', 0), ('health', 42), ('wisdom', 0), ('dexterity', 0)] However, I think the pythonic way is to use a dictionary. If you want the user to input numbers you need a second dictionary to translate the numbers into attribute names: >>> attributes = dict(attributes) >>> lookup = {1: "strength", 2: "health", 3: "wisdom", 4: "dexterity"} >>> while True: ... index = input("index ") ... if not index: break ... amount = int(input("amount ")) ... name = lookup[int(index)] ... attributes[name] += amount ... index 1 amount 10 index 2 amount 20 index 3 amount 10 index 2 amount -100 index >>> attributes {'dexterity': 0, 'strength': 10, 'health': -38, 'wisdom': 10} Personally I would ask for attribute names directly. ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Indexing a list with nested tuples
On 8/2/2011 10:44 PM, Alexander Quest wrote: Hi guys- I'm having a problem with a list that has nested tuples: attributes = [("strength", 0), ("health ", 0), ("wisdom ", 0), ("dexterity", 0)] I've defined the list above with 4 items, each starting with a value of 0. The player enters how many points he or she wants to add to a given item. The selection menu is 1 - strength; 2 - health; 3 - wisdom; 4- dexterity. So the "selection" variable is actually 1 more than the index location of the intended item. So I have the following code: print("Added ", points, "to ", attributes[selection-1][0], "attribute.") My intent with this is to say that I've added this many points (however many) to the corresponding item in the list. So if the player selects "1", then selection = 1, but I subtract 1 from that (selection -1) to get the index value of that item in the list (in this case 0). Then I have [0] to indicate that I want to go to the second value within that first item, which is the point value. I get an error saying that list indices must be integers, not strings. I get a similar error even if I just put attributes[selection][0] without the minus 1. Also, it seems that the tuple within the list cannot be modified directly, so I can't add points to the original value of "0" that all 4 items start with. Is there a way to keep this nested list with tuples but be able to modify the point count for each item, or will it be better to create a dictionary or 2 separate lists (1 for the names "Strength, Health, Wisdom, Dexterity" and one for their starting values "0,0,0,0")? Any suggestions/help will be greatly appreciated!!! Thanks for inquiring. Some guidelines about questions: 1 - show us more code. in this case specifically how you obtain user input. 2 - show the complete traceback What does the error message tell you? Why would selection be a string rather than an integer? This has to do with how you obtain selection from the user. What Why did you expect to be able to alter the value of a tuple element? Tuples are immutable! Use a list instead. HTH -- Bob Gailer 919-636-4239 Chapel Hill NC ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor