2014-07-20 13 views
5

Tôi có danh sách af của cấu trúc này được chuyển sang người mẫu với tên bars bằng Python 3.4:Jinja vòng lặp trong danh sách lồng nhau tạo ra sản phẩm nào ra

[{'var': 1.18, 'occurrences': [0.0805, 0.0808, 0.0991, 0.0994, 0.2356], 'name': 'item name'}, 
{'var': 2.31, 'occurrences': [1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791], 'name': 'other name'}] 

Tôi muốn nó để tạo đầu ra sau đây cho mỗi từ điển:

% List with names 
item 1: item name 
item 2: other name 

% List with vars 
item 1: 1.18 
item 2: 2.31 

% List with occurences 
item 1: 0.0805, 0.0808, 0.0991, 0.0994, 0.2356 
item 2: 1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791 

Hai đầu tiên không có vấn đề gì, nhưng tôi không thể làm cho nó lặp lại danh sách xuất hiện. Tôi sử dụng mẫu jinja sau:

{% for item in bars %} 
    item {{ loop.index }}: {{ item.name }} 
{% endfor %} 

{% for item in bars %} 
    item {{ loop.index }}: {{ item.var }} 
{% endfor %} 

{% for item in bars recursive %} 
    {% if item.occurrences %} 
    Item {{ loop.index}}: {{ loop(item.occurrences) }} 
    {% else %} 
    No content 
    {% endif %} 
{% endfor %} 

này mang lại cho sản lượng này lẻ trong trường hợp thứ ba:

Item 1:  No content 
No content 
No content 
No content 
No content 

Item 2:  No content 
No content 
No content 
No content 
No content 
No content 

Đó là số lẻ vì nó có vẻ rằng nó vòng từng hạng mục của danh sách với lần xuất hiện, nhưng nó không vượt qua bài kiểm tra cho nội dung. Tôi đang làm gì sai?

Chỉnh sửa: Tất cả ba câu trả lời đều chỉ cho tôi đúng hướng, nhưng @famousgarkin đưa ra câu trả lời phức tạp và linh hoạt nhất. Tôi đã kết thúc với giải pháp sau:

{% for item in bars %} 
    Item {{ loop.index }}: {% for occurrence in item.occurrences %} subitem {{ loop.index }}: {{ occurrence }} {% endfor %} 
{% endfor %} 

Điều này cho phép tôi kèm theo mỗi mục trong ngữ cảnh riêng, đó là những gì tôi muốn. Nhưng vì mục tiêu này không rõ ràng ngay từ đầu, tôi ước tôi có thể đưa ra tất cả các câu trả lời của bạn. Xin lỗi, nhưng cảm ơn tất cả các bạn đã giúp đỡ nhanh!

Trả lời

3

Nếu bạn không muốn định dạng các mục lồng nhau bằng cách sử dụng cùng một logic chính xác, bạn không sử dụng đệ quy.

Trong mẫu của bạn, khi lặp lại bars mục, nó sẽ đi đúng đường dẫn vì bạn có thể thấy Item n: trên đầu ra. Sau đó, nó xuống đến một cuộc gọi đệ quy để xử lý các mục item.occurrences. Bây giờ khi nó hỏi nếu occurrences tồn tại nó thực sự yêu cầu bar.occurrences[i].occurrences[j], mà tất nhiên không có thuộc tính occurrences và nó đi theo đường dẫn No content.Bạn có thể nhìn thấy nó trong hành động bằng cách sử dụng sau đây:

{% for item in bars recursive %} 
    {% if item.occurrences %} 
    Item {{ loop.index }}: {{ loop(item.occurrences) }} 
    {% else %} 
    No content, {{ item.__class__ }}, {{ item }} 
    {% endif %} 
{% endfor %} 

Sản lượng:

Item 1: No content, <type 'float'>, 0.0805 
No content, <type 'float'>, 0.0808 
No content, <type 'float'>, 0.0991 
No content, <type 'float'>, 0.0994 
No content, <type 'float'>, 0.2356 
... 

Nó sẽ làm việc như thế này, ví dụ:

{% for item in bars %} 
    {% if item.occurrences %} 
    Item {{ loop.index }}: {{ item.occurrences }} 
    {% else %} 
    No content 
    {% endif %} 
{% endfor %} 

Sản lượng:

Item 1: [0.0805, 0.0808, 0.0991, 0.0994, 0.2356] 
Item 2: [1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791] 

Nếu bạn muốn tự mình lặp lại các mục để cung cấp định dạng của riêng bạn, bạn có thể ví dụ như sử dụng Jinja join lọc:

{% for item in bars %} 
    {% if item.occurrences %} 
    Item {{ loop.index }}: {{ item.occurrences|join(', ') }} 
    {% else %} 
    No content 
    {% endif %} 
{% endfor %} 

Sản lượng:

Item 1: 0.0805, 0.0808, 0.0991, 0.0994, 0.2356 
Item 2: 1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791 

Hoặc lặp lại để cuộn định dạng hoàn toàn tùy chỉnh:

{% for item in bars %} 
    {% if item.occurrences %} 
    Item {{ loop.index }}: 
    {% for occurrence in item.occurrences %} 
     {{ loop.index }}. {{ occurrence }} 
    {% endfor %} 
    {% else %} 
    No content 
    {% endif %} 
{% endfor %} 

Sản lượng:

Item 1: 
1. 0.0805 
2. 0.0808 
3. 0.0991 
4. 0.0994 
5. 0.2356 
... 
0

Chỉ cần in ra khỏi danh sách.

{% for item in bars %} #recursive not needed 
    {% if item.occurrences %} 
    Item {{ loop.index }}: {{ item.occurrences }} #we're not looping here, just printing out the list 
    {% endif %} 
{% endfor %} 

Nếu bars sẽ luôn luôn có occurrences, bạn thậm chí sẽ không cần kiểm tra if.

Để in các mặt hàng indvidual từ lần xuất hiện chỉ lặp trên nó,

Item {{ loop.index}}: {% for occurrence in occurrences %} 
         {{ occurrence }}{% if not loop.last %}, {% endif %} 
         {% endfor %} 

Nếu bạn đang đi để in ra toàn bộ danh sách dù sao, bạn chỉ có thể sử dụng một bộ lọc mà trả về một đại diện str của danh sách mà không có sự dấu ngoặc vuông.

+0

Nhưng sau đó tôi phải làm gì để làm cho nó lặp lại danh sách và in từng mục thay vì chỉ in toàn bộ danh sách? Nhân tiện, tôi hiểu lầm câu lệnh if, có ý định kiểm tra xem có xảy ra sự thật không, nhưng tôi thấy bây giờ nó đã sai. Tôi không cần điều đó. @vikki – Stenskjaer

+0

@Stenskjaer vì 'lần xuất hiện' là danh sách, bạn có thể lặp lại lần nữa, xem chỉnh sửa của tôi. – vikki

0

Đây là mã làm việc.

  • quản lý không gian màu trắng để giữ cho dòng theo đúng kế hoạch
  • sử dụng bộ lọc join để tạo ra danh sách các lần xuất hiện
  • loại bỏ recursive từ Looping trên xuất hiện (như dữ liệu là bằng phẳng và không lồng nhau)

Chạy tập lệnh này:

from jinja2 import Template 

bars = [{'var': 1.18, 'occurrences': [0.0805, 0.0808, 0.0991, 0.0994, 0.2356], 'name': 'item name'}, 
    {'var': 2.31, 'occurrences': [1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791], 'name': 'other name'}] 
templ_str = """ 
% List with names 
{% for item in bars -%} 
    item {{ loop.index }}: {{ item.name }} 
{% endfor %} 
% List with vars 
{% for item in bars -%} 
    item {{ loop.index }}: {{ item.var }} 
{% endfor %} 
% List with occurrences 
{%- for item in bars %} 
item {{ loop.index}}:{{" "}} 
    {%- if item.occurrences -%} 
     {{ item.occurrences|join(", ") }} 
    {%- else -%} 
    No content 
    {%- endif -%} 
{%- endfor -%} 
""" 
templ = Template(templ_str) 
print templ.render(bars=bars) 

Bạn sẽ tạo t đầu ra này:

% List with names 
item 1: item name 
item 2: other name 

% List with vars 
item 1: 1.18 
item 2: 2.31 

% List with occurrences 
item 1: 0.0805, 0.0808, 0.0991, 0.0994, 0.2356 
item 2: 1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791 
Các vấn đề liên quan