Re: looping over dictionaries

2010-02-15 Thread Karen Tracey
On Mon, Feb 15, 2010 at 2:54 AM, Javier Rivera wrote:

> Karen Tracey wrote:
>
>>Now in a template I want to iterate over them as follows:
>>{% for project in projects %}
>>{{ project }}
>> {% for chain in project.chains %}
>> -- {{ chain }}
>> {% endfor %}
>>{% endfor %}
>>
>
>
Note what you've posted above is the original non-working template block.
What I posted to take its place was:

{% for project, chains_dict in projects.items %}
{{ project }}
 {% for chain in chains_dict.chains %}
 -- {{ chain }}
 {% endfor %}
{% endfor %}

And recall the value of projects that was posted:

projects = {u'NetMinutes': {'chains': [u'Arendus', u'Uuslahendus']},
u'Veel': {'chains': []}}



I'm usually use the values() property to iteract dictionary values. I find
> it more readable than items(), and usually, as I need to sort the output,
> the fact that it returns a list is quite useful.


If all you need to iterate over are the dictionary values, and you do not
care what the keys are, then using values() is appropriate.  That's not the
case for the originally posted block.


> {% for project in projects %}
>{{ project }}
>{% for chain in project.chains.values %}
> -- {{ chain }}
>{% endfor %}
> {% endfor %}
>
>
This block suffers from the same problem as the original.  Iterating over
'project in projects' just gives you the keys from projects, as strings. For
the posted projects value, project will take on the values u'NetMinutes' and
u'Veel' (not necessarily in that order) during successive iterations of the
loop. u'NetMinutes', or u'' does not have an attribute
chains, so the inner 'for chain in project.chains.values' has nothing to
iterate over.

For the originally posted block, it was clear that the intent was to use
both the keys and the values from the projects dictionary, that's why the
replacement proposed using items() when iterating over the projects dict.
Replacing 'for project in projects' with 'for project in projects.values'
would also not work since then the inclusion of {{ project }} in the 
header would not produce the desired output.

Karen

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.



Re: looping over dictionaries

2010-02-14 Thread Javier Rivera

Karen Tracey wrote:

Now in a template I want to iterate over them as follows:
{% for project in projects %}
{{ project }}
 {% for chain in project.chains %}
 -- {{ chain }}
 {% endfor %}
{% endfor %}


I'm usually use the values() property to iteract dictionary values. I 
find it more readable than items(), and usually, as I need to sort the 
output, the fact that it returns a list is quite useful.


{% for project in projects %}
{{ project }}
{% for chain in project.chains.values %}
 -- {{ chain }}
{% endfor %}
{% endfor %}

The drawback is that it (likely, not sure) uses more memory, as it makes 
a copy of the dictionary values as a list.


It seems that most people prefer items(). Why?.

Javier.

--
You received this message because you are subscribed to the Google Groups "Django 
users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.



Re: looping over dictionaries

2010-02-14 Thread Karen Tracey
On Sun, Feb 14, 2010 at 1:58 PM, Madis  wrote:

> Why will this not work or how should i write it to work:
>
> I have the following dictionary:
> projects = {u'NetMinutes': {'chains': [u'Arendus', u'Uuslahendus']},
> u'Veel': {'chains': []}}
>
> Now in a template I want to iterate over them as follows:
> {% for project in projects %}
> {{ project }}
>  {% for chain in project.chains %}
>  -- {{ chain }}
>  {% endfor %}
> {% endfor %}
>
> It iterates over the projects and prints out the project names but
> will not iterate over the project.chains.
> Maybe someone can give me some clues?
>


Iterating over projects just gives you the keys in the dictionary, as
strings. If you also want to work with the values assigned to the keys in
the dictionary you need to iterate over the key,value pairs returned by the
dictionary items() method. Then the value you have in your loop will have a
chains attribute you can access.  For example:

{% for project, chains_dict in projects.items %}
{{ project }}
 {% for chain in chains_dict.chains %}
 -- {{ chain }}
 {% endfor %}
{% endfor %}

Karen

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.



Re: looping over dictionaries

2010-02-14 Thread Skylar Saveland
{% for k, v in d.items %}
{{k}} {{v}}
{% endfor %}

On Feb 14, 1:58 pm, Madis  wrote:
> Why will this not work or how should i write it to work:
>
> I have the following dictionary:
> projects = {u'NetMinutes': {'chains': [u'Arendus', u'Uuslahendus']},
> u'Veel': {'chains': []}}
>
> Now in a template I want to iterate over them as follows:
> {% for project in projects %}
> {{ project }}
>   {% for chain in project.chains %}
>   -- {{ chain }}
>   {% endfor %}
> {% endfor %}
>
> It iterates over the projects and prints out the project names but
> will not iterate over the project.chains.
> Maybe someone can give me some clues?
>
> Regards,
> Madis

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.



looping over dictionaries

2010-02-14 Thread Madis
Why will this not work or how should i write it to work:

I have the following dictionary:
projects = {u'NetMinutes': {'chains': [u'Arendus', u'Uuslahendus']},
u'Veel': {'chains': []}}

Now in a template I want to iterate over them as follows:
{% for project in projects %}
{{ project }}
  {% for chain in project.chains %}
  -- {{ chain }}
  {% endfor %}
{% endfor %}

It iterates over the projects and prints out the project names but
will not iterate over the project.chains.
Maybe someone can give me some clues?

Regards,
Madis

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.