繁体   English   中英

将字典值转换为具有特定顺序的字符串对象

[英]Converting dictionary values into a string object with a specific order

我正在寻找创建一个函数,将具有地址值的字典转换为具有特定顺序的字符串值。 我还需要考虑缺失值(某些地址不会有第二个或第三个地址行。我希望我的输出如下所示,以便我可以将文本块(由新行分隔)复制到数据库字段中。

name
contact
addr1
addr2 (if not empty)
addr3 (if not empty)
city, state zip
phone

我有以下内容来创建字典,但我坚持创建忽略空值并将所有内容按正确顺序排列的字符串对象。

def setShippingAddr(name, contact, addr1, addr2, addr3, city, state, zipCode, phone):
    addDict = {'name': name, 'contact': contact, 'addr1': addr1,
               'city': city, 'state': state, 'zip': zipCode, 'phone': phone}
    if addr2 is True:    # append dict if addr2/addr 3 are True
        addDict['addr2'] = addr2
    if addr3 is True:
        addDict['addr3'] = addr3

    shAddr =     # This is where i need to create the string object
    return shAddr

看起来(假设您使用的是 python3),一个 f 字符串可以在这里工作。

shAddr = f"{addDict['name']} {addDict['contract'] etc..."

您可以在 {} 中添加逻辑,例如

{addDict['addr2'] if addDict['addr2'] else ""}

应该可以工作,具体取决于您要查找的特定输出是什么。

考虑到您可能希望向字典中添加新条目

def setShippingAddr(name, contact, addr1, addr2, addr3, city, state, zipCode, phone):
    addDict = {'name': name, 'contact': contact, 'addr1': addr1,
               'city': city, 'state': state, 'zip': zipCode, 'phone': phone}
    if addr2 is True:    # append dict if addr2/addr 3 are True
        addDict['addr2'] = addr2
    if addr3 is True:
        addDict['addr3'] = addr3

    shAddr = ''
    for key in addDict:
      shAddr += addDict[key] + '\n'
    return shAddr

我会重写函数以只返回字符串,不需要字典:

def setShippingAddr(name, contact, addr1, city, state, zipCode, phone, addr2=None, addr3=None):
    shAddr = f'{name}\n{contact}\n{addr1}'
    shAddr = f'{shAddr}\n{addr2}' if addr2 else shAddr
    shAddr = f'{shAddr}\n{addr3}' if addr3 else shAddr
    shAddr = f'{shAddr}\n{city}, {state} {zipCode}\n{phone}'
    return shAddr

我不确定我是否理解字典的部分。 你可以把它放在一边,对吧? 然后

def setShippingAddr(*args):
    return "\n".join([str(arg) for arg in args if arg])


s = setShippingAddr("Delenges", "Me", "Streetstreet", "Borrough", False, 
                    "Town of City", "Landcountry", 12353, "+1 555 4545454")
print(s)

印刷

    Delenges
    Me
    Streetstreet
    Borrough
    Town of City
    Landcountry
    12353
    +1 555 4545454

这是一个更pythonic的解决方案,

def dict_to_string(dic):
    s = ''
    for k, v in dic.items():
        s += "{} : {}\n".format(k, v)
    return s


addDict = {'name': 'name', 'contact': 'contact', 'addr1': 'addr1', 'addr2': '',
           'city': 'city', 'state': 'state', 'zip': 'zipCode', 'phone': 'phone'}
print(dict_to_string(addDict))

在这种情况下,我使用了 addr2,它有一个空白值。 如果需要,可以完全省略 addr2,然后在迭代时检查该值。

def dict_to_string(dic):
    s = ''
    for k, v in dic.items():
        if k:
            s += "{} : {}\n".format(k, v)
    return s


addDict = {'name': 'name', 'contact': 'contact', 'addr1': 'addr1', 'addr2': '',
           'city': 'city', 'state': 'state', 'zip': 'zipCode', 'phone': 'phone'}
print(dict_to_string(addDict))

最后,如果迭代的自然顺序不是你想要的,你可以使用OrderedDict

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM