【问题标题】:Python is printing one list backwards but not the othersPython 正在向后打印一个列表,而不是其他列表
【发布时间】:2015-09-16 10:56:40
【问题描述】:

我正在使用带有 MySQL 后端的 Django 1.8。我需要从数据库中的几个表中获取两列并将它们连接起来,然后将排序结果放在网页上。到目前为止我有这个:

views.py

def herps(request):
    #performs queries to get distinct species from the database

    trQuery = queryBuilder(HetrRec, '_hetr')
    opQuery = queryBuilder(HeopRec, '_heop')

    valList = opQuery + trQuery

    query = sorted(set(valList))
return render_to_response('herps.html', {'queries': query,})

对数据库执行查询的函数如下所示:

def queryBuilder(table, column_str):

    genus = 'genus' + column_str
    species = 'species' + column_str
    filterSp = {species: 'sp.'}

query = table.objects.order_by(species, genus).values(genus, species).distinct().exclude(**filterSp)
valueList = []
for q in query:
    species = ' '.join(q.values())
    valueList.append(species)

return(valueList)

因此,输出以 Genus Species 的形式出现在几个表组合中。在一张表中,它出现了 Species Genus。

我已经通过这些数据删除了任何可能影响它的字符(前导/尾随空格、不完整的对等),但没有任何乐趣。

【问题讨论】:

  • 您正在构建的两个列表中,哪个是正确的,您认为哪个是倒退的?
  • trQuery 出来是正确的, opQuery 回到前面。我尝试更改对 queryBuilder() 的调用顺序并使用其他表(包括链接来自多个不同表的多个查询)。只有一张表与从后到前的串联一致(先是物种,然后是属,而不是先是属,然后是物种)。

标签: python mysql django django-1.8


【解决方案1】:

正如文档所拥有的那样,不是返回一个字典(对于那个表来说是从前到后),而是可以选择返回一个值列表。结果是正确的,因此 queryBuilder() 函数的工作方式如下:

views.py

def queryBuilder(table, column_str):

genus = 'genus_' + column_str
species = 'species_' + column_str
filterSp = {species: 'sp.'}


query = table.objects.values_list(genus, species).distinct().exclude(**filterSp)
valueList = []
for q in sorted(query):
    species = ' '.join(q)
    valueList.append(species)

return(valueList)

我仍然不知道为什么上一个查询对于那个烦人的表来说是错误的。

【讨论】:

    【解决方案2】:

    我会将代码缩短到很可能是问题的特定部分:

    query = table.objects.values(genus, species)
    valueList = []
    for q in query:
        species = ' '.join(q.values())
        valueList.append(species)
    

    正如您在文档中所读到的,values() 将返回一个字典列表,如下所示:

    [{'genus_hetr': 'foogenus', 'species_hetr': 'foospecie'},
     {'genus_hetr': 'bargenus', 'species_hetr': 'barspecie'}]
    

    然后您将遍历该列表。在每次迭代中,q 都是字典之一。到目前为止,一切都很好。那么问题来了:

    ' '.join(q.values())
    

    字典没有排序。所以这将加入所有值,但顺序是任意的。甚至那些你认为可以正常工作的桌子也会在以后随机损坏。

    那么如何解决呢?好吧,就像你做的那样,使用 values_list 返回有序的元组。另一种选择是不依赖顺序,而是使用字典,即按键寻址:

    species = '%s %s' % (q[genus], q[species])
    

    顺便说一句,对于这样一个简单的情况,您可能希望使用列表推导。整个循环可以这样写:

    valuesList = ['%s %s' % (q[genus], q[species]) for q in query]
    

    【讨论】:

    • 非常感谢光谱。列表理解有效。比我的笨拙更清洁的方法,感谢您的清晰解释。
    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2022-10-19
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多