[英]Python is printing one list backwards but not the others
我正在將Django 1.8與MySQL后端一起使用。 我需要從數據庫中的幾個表中獲取兩列並將它們連接起來,然后將排序后的結果放在網頁上。 到目前為止,我有:
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)
因此,輸出以屬種的幾種表組合形式出現。 在一張表格中列出了物種屬。
我已經通過數據刪除了可能會影響它的所有字符(前導/尾隨空格,不完整的對等),但沒有任何樂趣。
我將代碼縮短到很可能是該問題的特定部分:
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]
正如文檔所希望的那樣,它有一個返回值列表的選項,而不是返回字典(該表返回到最前面的字典)。 這是正確的方法,因此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)
我仍然不知道為什么以前的查詢對於那個令人討厭的表來說是錯誤的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.