[英]Elegant way to concat all dict values together with a string carrier as a single string in Python
目標是將concat
中的所有值dict
到一個str.
此外,還將附加\r\n
。
下面的代碼演示了最終結果。
但是,我正在尋找比下面建議的代碼更優雅的替代方案。
d=dict(idx='1',sat='so',sox=[['x1: y3'],['x2: y1'],['x3: y3']],mul_sol='my love so')
s=''
for x in d:
if x=='sox':
for kk in d[x]:
s=s +kk[0] +'\r\n'
else:
s=s +d[x]+'\r\n'
print(s)
以下代碼可以更好地控制字典中可能包含的內容:
def conca(li):
ret=''
for ele in li:
if isinstance(ele,str):
ret += ele + '\r\n'
else:
ret += conca(ele)
return ret
print(conca([d[e] for e in list(d)]))
或者如果想要一個更通用的解決方案:
def conca(li):
ret = ''
for ele in li:
if isinstance(ele, str):
ret += ele + '\r\n'
elif isinstance(ele, list):
ret += conca(ele)
elif isinstance(ele, dict):
ret += conca(ele.values())
# you can add any other customized conversions here...
else:
raise Exception(
"value of dictionary can only be str, list or dict~")
return ret
print(conca([d[e] for e in list(d)]))
制作一個單獨的 function 來轉換值,然后使用map
應用它。
d = {
'idx': '1',
'sat': 'so',
'sox': [['x1: y3'],['x2: y1'],['x3: y3']],
'mul_sol': 'my love so'
}
crlf = '\r\n'
import operator
def transform_sox(item):
(key, val) = item
if key == 'sox':
return crlf.join(map(operator.itemgetter(0), val))
else:
return val
print(crlf.join(map(transform_sox, d.items())), crlf)
在我看來,不一定更短,但更清晰、更易於維護。
或者,如果我們可以依靠值類型而不是鍵來確定轉換:
def transform_sox(value):
return value if isinstance(value, str) \
else crlf.join(map(operator.itemgetter(0), value))
print(crlf.join(map(transform_sox, d.values())), crlf)
另一方面,也許您需要為字典中的一些元素自定義格式化程序。 在這種情況下,查找每個元素的格式化程序:
formatters = collections.defaultdict(lambda: lambda x: x)
formatters['sox'] = lambda x: crlf.join(map(operator.itemgetter(0), x))
def transform_sox(item):
return formatters[item[0]](item[1])
print(crlf.join(map(transform_sox, d.items())), crlf)
使用兩個生成器,一個用於d['sox']
,另一個用於其他一切,然后使用join()
連接字符串。
s = ''.join(kk[0] for kk in d['sox']) + '\r\n'
s += '\r\n'.join(val for key, val in d.items() if key != 'sox')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.