Python/Django:根据字符串是否存在拼接字符串

5

我正在创建一个名为“address”的Django模型属性。我希望地址由我在模型上拥有的多个字段的串联组成。问题是,这些字段并非所有此模型的实例都具备值。因此,我只想串联具有值的字段。

哪种方法是最佳/最Pythonic的呢?

以下是模型中相关的字段:

house = models.IntegerField('House Number', null=True, blank=True)
suf = models.CharField('House Number Suffix', max_length=1, null=True, blank=True)
unit = models.CharField('Address Unit', max_length=7, null=True, blank=True)
stex = models.IntegerField('Address Extention', null=True, blank=True)
stdir = models.CharField('Street Direction', max_length=254, null=True, blank=True)
stnam = models.CharField('Street Name', max_length=30, null=True, blank=True)
stdes = models.CharField('Street Designation', max_length=3, null=True, blank=True)
stdessuf = models.CharField('Street Designation Suffix',max_length=1, null=True, blank=True)

我可以这样做:

我只需要做类似于以下的事情:

def _get_address(self):
    return "%s %s %s %s %s %s %s %s" % (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self.stdes, self.stdessuf)

但是这样会在结果中留下额外的空格。

我可以使用一系列 “if” 语句并在每个语句内进行连接,但这看起来很丑陋。

处理这种情况的最佳方法是什么?

谢谢。

3个回答

4
parts = (1, 'a', 'b', 2, 'c', 'd', None, 'f')
# parts = (self.house, self.suf, self.unit, 
#           self.stex, self.stdir, self.stname, 
#           self.stdes, self.stdessuf)
' '.join(str(part) for part in parts if part is not None)
# '1 a b 2 c d e f'

您只需使用列表推导式,检查任何值是否为“None”,并将它们转换为字符串,以便无论类型如何,它们都可以正确连接。


感谢添加了'not None'的功能 - Douglas Meehan
@DouglasMeehan:当然。如果你想节省每次调用方法时创建临时列表的开销,你可以将字段保存在一个列表中作为类属性,因为它不会在实例之间改变。 - jdi
在这种情况下,哪个更好?元组还是列表? - Douglas Meehan
那么我会创建另一个属性,它将是这些字段的列表,然后在地址属性中引用该属性? - Douglas Meehan
一个列表相比元组有轻微的开销,但如果你根本不打算对它进行修改,请使用元组。然后,在字段之后可以创建另一个类属性,然后在方法中使用self._address_fields引用它。 - jdi
显示剩余2条评论

2
我会使用生成器来获取非假值,然后将它们连接起来。例如:
parts = (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self.stdes, self.stdessuf)
return " ".join(str(s) for s in parts if s is not None)

你需要检查是否为None,而不是Falsey值。 None与0不同,0是一个有效的数字。 - jdi
那么在这种情况下,我可以这样做: parts = (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self.stdes, self.stdessuf) return " ".join(str(s) for s in parts if s is not None) - Douglas Meehan

2
" ".join(filter(None, 
               [self.house, self.suf, self.unit, 
                self.stex, self.stdir, self.stname, 
                self.stdes, self.stdessuf]))

如果该字段不是字符串,这将会出错。 - jdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接