Python 将循环多个列表的所有内容提取为一

Python 将循环多个列表的所有内容提取为一,python,django,Python,Django,我的django中有以下内容: 我的模特 import datetime from datetime import datetime, date, timedelta import dateutil from dateutil.relativedelta import relativedelta from dateutil.rrule import rrule, WEEKLY, MO, SU from django.utils import timezone from django.db imp

我的django中有以下内容:

我的模特

import datetime
from datetime import datetime, date, timedelta
import dateutil
from dateutil.relativedelta import relativedelta
from dateutil.rrule import rrule, WEEKLY, MO, SU
from django.utils import timezone
from django.db import models
from django.db import connections

class WeeklyReports(models.Model):
    def FourWeeks(self, year, week):
        self.year = year
        self.week = week
        end = datetime(year, 1, 1) + relativedelta(weeks=week-1, weekday=SU)
        start = end - relativedelta(weeks=4, weekday=MO)
        mint, maxt = datetime.min.time(), datetime.max.time()
        for dt in rrule(WEEKLY, start, count=4):
            yield dt.combine(dt, mint), dt.combine(dt + timedelta(days=6), maxt)
views.py:

import itertools
from itertools import chain, groupby
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect
from datetime import datetime 
from weeklyreport.models import WeeklyReports
from django.http import HttpResponse
from django.db import connections

def WeekCombo(request):
    fweeks = []
    cursor = connections['nocdb'].cursor()
    year = 2013
    week = 48
    w = WeeklyReports()
    for start, end in w.FourWeeks(year, week):
        cursor.execute("SELECT DISTINCT (p.name) AS platform, count(e.id ) AS count FROM event e, lu_platform p WHERE e.platform_id = p.id AND e.sourcetype_id = 1 AND e.event_datetime BETWEEN %s AND %s AND e.sender_id  NOT IN ( 759, 73 ) GROUP BY p.name ORDER BY p.name", [start, end] )
        r = [i for i in chain.from_iterable(cursor.fetchall())]
        fweeks.append([n for n in r])
    return render_to_response('form.html', {'fweeks': fweeks}, 
                              context_instance=RequestContext(request))
通过fetchall循环,我得到了四个列表:

[u'Cust01', 191L, u'Cust02', 21L, u'Cust03', 420L]
[u'Cust01', 17L, u'Cust02', 96L, u'cust03', 11L]
[u'Cust01', 44L, u'Cust02', 225L, u'Cust03', 356L]
[u'Cust01', 76L, u'Cust02', 304L, u'Cust03', 157L, u'Cust04', 212L]
我如何从这四个独立的查询列表中创建一个嵌套列表?如何在循环中合并此列表

[['Cusr01','Cust02','Cust03', 'Cust04'], [191, 21, 420], [17, 96, 11], [44, 225, 356],
[76, 304, 157, 121]]

如果您只是想以这种格式转换一组列表:

data = [[x, y], [x, y], [x, y]]
[[x, x, x], [y, y, y]]
转换为以下格式:

data = [[x, y], [x, y], [x, y]]
[[x, x, x], [y, y, y]]
您可以使用内置的
zip
功能:

results = zip(data)
因此,您的代码将变成:

def WeekCombo(request):
    fweeks = []
    cursor = connections['nocdb'].cursor()
    for start, end in WeeklyReports().FourWeeks(2013, 48):
        cursor.execute("""
            SELECT DISTINCT (p.name) AS platform,
                COUNT(e.id ) AS count
            FROM event e, lu_platform p
            WHERE e.platform_id = p.id
            AND e.sourcetype_id = 1
            AND e.event_datetime BETWEEN %s AND %s
            AND e.sender_id  NOT IN ( 759, 73 )
            GROUP BY p.name
            ORDER BY p.name""", [start, end] )
        fweeks.extend(cursor.fetchall())
    fweeks = zip(fweeks)
    return render_to_response('form.html', {'fweeks': fweeks}, 
                              context_instance=RequestContext(request))

首先,
[i for i in foo]
没有做任何事情;这与
list(foo)
是一样的。然后你用
[n代表n在r]
再做一次,其中
r
只是上面
[i代表i在foo]
的结果。你只是无缘无故地复制了一份清单。你想用这些行做什么?其次,
fetchall
返回一个iterable行,每个行都是iterable列<代码>链。from_iterable将其转换为列的平面iterable。你已经做完了。您附加到
fweeks
的每一项内容都已展平。这意味着
fweeks
最终将成为一个简单列表。这正是你想要的。那么…这里有什么问题?最后,当你说“使用我的fetchall循环,我得到四个列表”时,你从哪里得到这些列表?代码中唯一的
fetchall
循环是隐藏在
链中的循环。从_iterable
,或者可能是列表中无用的额外循环。因此,是的,每个
i
都是一个单一的平面列表,但是您还希望它是什么,您首先是如何查看它的?谢谢您的回复,确实有一份副本列表,如何合并第一个列表中的唯一名称和下一个列表中每个查询的值?我不明白您在最后一条评论中要求的是什么。我还是看不出你一开始有什么问题。向我们展示实际生成您所询问的输出的代码(理想情况下是精简的、可运行的代码,不需要访问您的数据库和其他您没有向我们展示的功能,请参阅以获取指导),并告诉我们您想要的输出,以及从代码中获取的输出。那么你的问题就可以回答了。谢谢你,你的代码非常优雅。通过这个,我得到了元组列表。(u'Cust01',191L),(u'Cust02',21L),(u'Cust03',420L),(u'Cust04',150L),(u'Cust01',96L),(u'Cust02',11L),(u'Cust03',388L),(u'Cust01',44L),(u'Cust02',225L),(u'Cust03',356L)。。。。结束soAnd,使用以下fweeks=list((zip(*fweeks)),我可以拆分名称和值。(u'Cust01',u'Cust02',u'Cust03',u'Cust04'…u'Cust01',u'Cust02',u'Cust03',u'Cust04')(191L,21L,420L,150L,759L,290L…403L,556L,130L,12L,973L)我要做的是用谷歌图表建立图表,我需要以下格式的列表:[[Cusr01','Cust02','Cust03','Cust04',[191 21420],[17,96,11],[44,225,356],[76,304,157,121]]或者是更好的模板格式?