在Python中将所有字典值与字符串载波连接在一起作为单个字符串的优雅方式



目标是将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')

相关内容

  • 没有找到相关文章

最新更新