簡體   English   中英

在 Python 中將所有 dict 值與字符串載體作為單個字符串連接在一起的優雅方式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM