2013-12-13 41 views
0

之間的聯接所以我有以下的字典(這是一個字典,而不是一個列表的原因是由於queryparams-parser Django的包解析POST值的輸出:從列表解析結果加入數組字符串中的所有字符

doctor_times = { 
    '1': { 
     'id': 'ABC', 
    }, 
    '2': { 
     'id': 'DEF', 
    }, 
} 

的計劃是將這些合併爲這我還以爲下面的代碼會做一個字符串,如"'ABC', 'DEF'"

doctorcodes = ', '.join("'%s'" % [str(doctor_times[k]['id']) for k in doctor_times.keys()]) 

然而這會導致:

"[, ', A, B, C, ', ,, , ', D, E, F, ', ]" 

如果我刪除'%s' %組件,但它工作正常,但我確實需要它們單獨包裝在引號中。

+1

您顯示的「doctor_times」字典無效。如果這些字符串實際上是字符串的,你可能需要引用'ABC'和'DEF'。另外,你真的想要組合字符串中的內部引號嗎?你關心他們是什麼樣的引號? – Blckknght

+0

你是對的,我錯過了整個問題的幾個引號,我會更新 – DanH

回答

2

您的代碼存在的問題是,您將整個列表傳遞給'%s' %部分。而是隻將它移動到像這樣的字符串部分。

print ', '.join(['%s' % str(doctor_times[k]['id']) for k in doctor_times.keys()]) 

,你不需要將數據與%s重新格式化爲str。因此,它變得像這樣

print ', '.join(str(doctor_times[k]['id']) for k in doctor_times.keys()) 

這可以進一步簡化,這樣

print ", ".join(str(v['id']) for v in doctor_times.values()) 
+0

好吧,給我一分鐘來包裹我的頭圍繞此... – DanH

+0

啊啊是的愚蠢的我,謝謝指出明顯。儘管如此,感謝替代方案,更好。 – DanH

+0

呵呵,'str()'是因爲在POST請求中字符串可能是[0-9],而queryparser會將其解釋爲數字。 – DanH

0

你可能需要一個更通用的方法,通過對嵌套字典的values調用dict.values。你有什麼是兩個深度嵌套的字典,但任意深度,以下解決方案可以很容易地通過

>>> ','.join(str(e[0]) for e in map(dict.values, doctor_times.values())) 
'ABC,DEF' 

或者如果你喜歡itertools

>>> from itertools import imap, chain 
>>> ', '.join(map(str, chain.from_iterable(imap(dict.values, doctor_times.values())))) 
'ABC, DEF' 
+0

值也可以是數字,而不僅僅是字符串。 – thefourtheye

+0

可以,但你的解決方案確實考慮過。 – Abhijit

+0

即使我最初並沒有考慮過,他解釋了爲什麼他在評論中使用'str':) – thefourtheye

0

我想你可能想:

", ".join(repr(v["id"]) for v in doctor_times.values()) 

雖然這將以任意順序連接值。如果您想要的順序是一致的(總是"'ABC', 'DEF'"永不"'DEF', 'ABC'"),你可能反而需要字典項目進行排序,而不是僅僅遍歷值直接:

", ".join(repr(v["id"]) for k, v in sorted(doctor_times.items())) 

還有一個潛在的問題與此碼。如果你的一些字符串中有單引號字符(並且沒有雙引號字符),它們的repr將使用雙引號而不是單引號字符。如果一個字符串包含單引號和雙引號,則單引號字符將以\轉義。如果連接的字符串需要遵循某些特定的約定(例如編程語言或數據協議的規則),則可能需要使用自己的轉義代碼,而不是依賴於repr

+0

我們不需要'k'和'​​items'。 – thefourtheye

+0

@thefourtheye:排序需要''k'和'​​items'。 'k,v'元組將按'k'值排序(值被忽略,因爲字典鍵保證是唯一的)。 – Blckknght

+0

這是一個新的要求,然後... – thefourtheye