目标是将dict
中的所有值concat
变为单个str.
另外,rn
也将被追加。
下面的代码演示了最终结果。
然而,我正在寻找一个比下面建议的代码更优雅的替代方案。
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] +'rn'
else:
s=s +d[x]+'rn'
print(s)
创建一个单独的函数来转换这些值,然后使用map
应用它。
d = {
'idx': '1',
'sat': 'so',
'sox': [['x1: y3'],['x2: y1'],['x3: y3']],
'mul_sol': 'my love so'
}
crlf = 'rn'
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)
下面的代码对字典中可能包含的内容有更多的控制:
def conca(li):
ret=''
for ele in li:
if isinstance(ele,str):
ret += ele + 'rn'
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 + 'rn'
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)]))
使用两个生成器,一个用于d['sox']
,另一个用于其他所有内容,然后使用join()
连接字符串。
s = ''.join(kk[0] for kk in d['sox']) + 'rn'
s += 'rn'.join(val for key, val in d.items() if key != 'sox')