Re: [Tutor] Indexing a list with nested tuples

2011-08-05 Thread Alexander Quest
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

2011-08-05 Thread Christopher King
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

2011-08-03 Thread Alexander Quest
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

2011-08-03 Thread Alexander Quest
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

2011-08-03 Thread bob gailer

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

2011-08-03 Thread Peter Otten
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

2011-08-02 Thread bob gailer

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